예를 들어 처음에는 다음 코드가 있었습니다.
으아악
나중에 y가 x와 동일해야 한다는 사실을 발견했습니다. x+y를 x * 2로 재구성하고 싶었지만 재구성 전후에 전체 프로그램이 동일하게 작동하는지 확인해야 했습니다. x+x는 x*2와 동일합니까? +와 *가 다른 계산 메커니즘을 사용하여 다른 결과로 반올림되는지는 알 수 없습니다.
테스트한 내용:
으아악
i 의 특정 범위에서는 올바른 것 같지만 모든 부동 소수점 숫자에 대해서는 올바른지 확실하지 않습니다.
JavaScript는 ECMAScript의 구현이며 ECMAScript 사양은 IEEE 754 알고리즘을 사용하는 것을 의미하며, IEEE-754 "배정밀도"(binary64) 형식은 "... 숫자에 적용될 때, 연산자 IEEE 754-2019의 관련 작업을 참조합니다..."
IEEE 754 및 기타 합리적인 부동 소수점 시스템에서 연산 결과는 선택한 반올림 규칙에 따라 반올림된(예: 가장 가까운 동점으로 반올림, 짝수로 반올림, 짝수로 반올림), 0으로 반올림된 정확한 수학적 결과입니다. 반올림 또는 내림). IEEE 754-2019 4.3 내용:
Since
x
+x
和 2•x
具有相同的数学结果,因此浮点运算x+x
code> 和2*x
는 동일한 계산 결과를 생성해야 합니다. 동일한 반올림 규칙이 적용되면 둘 다 동일한 수학적 결과를 제공하므로 계산이 동일해야 합니다.위에서 다룬 내용
x
是数字的情况,包括+∞和-∞。如果x
是NaN
,则x+x
和2*x
也会产生NaN
code>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x
将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用2*x
代替x+x
, 프로그램 동작은 동일하며 그 반대도 마찬가지입니다. )