在C#和C+中,将浮点/双精度乘以0.5而不是除以2是否安全+;?

在C#和C+中,将浮点/双精度乘以0.5而不是除以2是否安全+;?,c#,c++,.net,performance,optimization,C#,C++,.net,Performance,Optimization,基本上是这样的(不是真正的代码): 这可能看起来是过早的优化,但是这必须是尽可能快地调用数十亿个点(点云)。< /P> < P>无论如何不是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) => (

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


这可能看起来是过早的优化,但是这必须是尽可能快地调用数十亿个点(点云)。< /P> < P>无论如何不是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);
产生:

0.333333333333333
0.3333333

因此,如果失去精度而获得额外精度是可以的,那么“安全”可能是正确的。

当您衡量两种选择的性能时会发生什么?如果不在目标平台上衡量结果,就不能在这个级别上谈论优化。同意Greg的观点。此外,请记住,在提高速度之前,您应该关注正确性。大多数情况下,编译器会为您优化其中的大部分内容(尤其是当您使用文字时)。@Chad:我希望不是针对浮点。内存访问将成为那里的瓶颈。在现代硬件上,mul和div FP ops的性能非常相似。10年前,这种优化可能更有用。我刚刚测试过它。是的,VC++似乎将
/2
替换为
*.5
“5.将结果转换为双精度”:这些代理是否有可能
Func
?是的,对不起,我的副本不正确。。。修正了。这一点很正确,但在我看来,问题在于将除法改为乘法是否会改变结果(假设两者的输入相同),在这种情况下,我看不出会是什么情况。i、 e.在除法前将(f1+f2)浇铸为双精度,或将0.5浇铸为浮动,且结果应相同。LIT确实会改变结果-这就是我在上面说明的内容。我有两个具有相同签名的方法,它们都计算两个浮点数之间的平均值。一个使用(x+y)*0.5,另一个使用(x+y)/2,它们返回不同精度的数字。是的,这些值在较短的精度下是等效的,但是精度在他的用例中可能很重要。正如我所说,如果您对这些值进行转换,使除法/乘法使用相同的精度输入,那么输出将是相同的。你的大部分帖子都是关于表明你的例子并非如此,所以我想你误解了我?
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);
Console.Out.WriteLine(((double)1) * ((double)1/3));
Console.Out.WriteLine((1) / ((float)3));
0.333333333333333
0.3333333