【发布时间】:2018-09-24 14:00:42
【问题描述】:
有什么方法可以在 C# 中快速比较两个浮点数的符号?我怀疑一次又一次地将浮点数与 0 进行比较的性能。但是,在C#中似乎禁止对float进行位操作,所以我们不能使用(a^b)&0x80000000或((a >> 31) == (b >> 31))之类的方法来确定(忽略大小写0 这里)。
从浮点数转换为整数(无指针)的问题是四舍五入,因为每个小于 1 的数字都会被四舍五入为 0。
从float转换为int(带指针)的问题只有两个可能的返回值,无法识别0。
现在是时候测试0预判和指针转换组合的性能了。
(删除我在这里犯的错误)
【问题讨论】:
-
Math.Sign(a) == Math.Sign(b)?但是Sign只是比较< 0、> 0、== 0 -
如果您怀疑“一次又一次比较”的性能,请将值存储在布尔值中。当然,这可能是您正在进行微优化的情况。可能是为了速度咆哮:ericlippert.com/2012/12/17/performance-rant
-
@john:在这种情况下,我相信框架程序员和 JiT 的能力。看看对数组边界检查所做的优化:blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/…
-
@Christopher 我没有怀疑他们,我只是stating a fact。
-
(a) 浮点数有 +0 和 -0。比较 -0 到 +3 或 -0 到 +0 时,您想要什么结果? (b) 如果位测试或其他高性能代码在语义上等价,您为什么认为编译器不会优化比较?
标签: c# floating-point compare signed