提问人:displaydisplayname 提问时间:6/19/2023 更新时间:6/19/2023 访问量:67
对于浮点数 a 和 b,没有溢出、下溢和 NaN,a-b>0 是否总是等于 a>b?
For float numbers a and b, without overflow, underflow and NaN, is a-b>0 always equals to a>b?
问:
例如,如果我想重构代码:a-b>0 到 a>b,它们是否相同?没有溢流、下溢和 NaN,是否有 a-b>0 和 a>b 产生不同值的 a 和 b?例如:A-B 和 A>B 是否会使用不同的舍入机制,从而导致不同的结果?
答:
很高兴您停下来考虑浮点数的边缘情况。答案是肯定的,这是安全的。
Javascript 中的浮点数存储为 64 位 IEEE 754 浮点数。数据结构是一个符号位,后跟 11 个指数位,后跟 52 个有效(小数)位。
要想出现问题,就必须有一个场景,在极少数情况下,减法产生零而不是小数字。让我们考虑一下极端情况:a-b
如果发生,where 很大且很小,那么可能是因为浮点数没有足够的精度来注意到差异,因为有效数中没有足够的位来表示微小的差异。但是,这不会影响结果,因为生成与 相同的答案。c=a-b
a
b
c==a
a>0
a-b>0
如果 和 非常接近,以至于它们都具有相同的指数位,那么执行减法就不会有问题,因为有效数将能够捕获差值。a
b
JavaScript 是 ECMAScript 的实现,ECMAScript 规范规定使用 IEEE 754 算法,采用 IEEE-754“双精度”(binary64) 格式。第5.2.5条说:“......当应用于数字时,操作员指的是 IEEE 754-2019 中的相关操作......”
IEEE 754 次正常支持是专门设计的,因此相当于 .一些浮点系统仅支持规范化数字,其中前导位必须为 1,但数字 0 的表示形式除外。例如,在此类系统中,从 1.0001 2•2 e min 中减去 1.0000 2•2 e min(其中 e min 是格式的最小指数)必须产生零,因为 0.0001 2•2 e min 是不可表示的。在 IEEE 754 中,此值是可表示的,并且需要减法才能产生它作为结果。a-b > 0
a > b
如果此属性对应用程序至关重要,我会担心某些 JavaScript 应用程序可能不符合规范。处理器具有某种模式,在该模式下,它们产生零而不是次正态结果,或者将算术指令的次正态输入操作数视为零,并且在此类处理器上运行的正确 JavaScript 实现而不确保禁用该模式可能会产生不正确的结果。
评论
different rounding mechanisms
???为什么在比较值时会有四舍五入?