例如:
const n=5;
const x=1.23;
const y=n-x;
document.write(x+y==n);
关于n=5,x=1.23,y=5-1.23(四舍五入后的值)的代码打印出true。我认为这只是一个“幸运”的情况,因为我认为可能会有一些情况,使得n-x会四舍五入到某个值,以至于x+y再次不等于n。但是我尝试使用for循环来找到一些错误的情况:
for(let i=0;i<100000;i++){
const n=Math.floor(Math.random()*10000);
const x=Math.random()*5000;
const y=n-x;
if(x+y!=n){
document.write(x+","+y+","+n);
break;
}
}
令人惊讶的是,连续多次运行时不会打印任何异常。
所以我的问题是,对于任何浮点数x、y、整数n,其中const y=n-x,并且o<=x、y、n<=MAX_VALUE,是否总是成立x+y==n?如果是,原因是什么?是否存在任何错误的情况?
附注:似乎对于x>n也是正确的:
for(let i=0;i<100000;i++){
const n=Math.floor(Math.random()*10000);
const x=10000+Math.random()*5000;
const y=n-x;
if(x+y!=n){
document.write(x+","+y+","+n);
break;
}
}
但不适用于x为负数的情况:
for(let i=0;i<100000;i++){
const n=Math.floor(Math.random()*10000);
const x=Math.random()*-5000;
const y=n-x;
if(x+y!=n){
document.write(x+","+y+","+n);
break;
}
}
这是什么原因?
js-hexfloat
是我在JS中找到的最好的工具,在C中使用printf
时是%a
转换,std::hexfloat
在C ++中或者在Python中使用float.hex()
。 - Sam Mason