gpt4 book ai didi

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:11 31 4
gpt4 key购买 nike

基本上是这样的(不是真正的代码):

for(int i = 0; i < 1000000000; ++i)
{
Vert v0 = mesh.polygons[i].edges[0].vert0;
Vert v1 = mesh.polygons[i].edges[0].vert1;

Vector3 center = (v0.pos + v1.pos) / 2;
}

v0.pos类型为 Vector3<float, float, float> , 但可能是 Vector3<double, double, double> .

这样做安全吗?:

Vector3 center = (v0.pos + v1.pos) * 0.5;

这似乎是不成熟的优化,但它必须尽可能快,以便在数十亿点(点云)上调用。

最佳答案

无论如何都不是 C++ 专家,但在 C# 中,这样做:

var a = new Func<float, float, double>((float f1, float f2) => (f1 + f2) * 0.5);
var b = new Func<float, float, double>((float f1, float f2) => (f1 + f2) / 2);

在前者中生成 IL:

  1. 加载参数
  2. 添加它们(制作单曲)
  3. 将结果转换为 double
  4. 加载双参数 (0.5)
  5. 乘法(产生双倍)
  6. 返回结果

和后者

  1. 加载参数
  2. 添加它们(制作单曲)
  3. 加载常数整数 (2)
  4. 除法(产生单个,因为单个/整数产生单个)
  5. 将结果转换为 double
  6. 返回结果

令我印象深刻的是,前者可能具有更高的精度,因为乘法是在 2 个 double 上执行的,从而导致 double ,而在后者中,除法是在一个向上转换为 double 的单精度上执行的(但仍然只会具有单精度)。

这证明了我:

Console.Out.WriteLine(((double)1) * ((double)1/3));
Console.Out.WriteLine((1) / ((float)3));

产生:

0.333333333333333
0.3333333

所以,'安全',也许,如果失去精度 获得额外的精度是可以的。

关于c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884556/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com