Tae*_*Cho 8 c++ floating-point
这是我的简单代码。
int num1, num2;
cin >> num1 >> num2;
int num3, num4;
cin >> num3 >> num4;
double result1 = static_cast<double>(num1) / num2;
double result2 = static_cast<double>(num3) / num4;
cout.setf(ios::boolalpha);
cout << (result1 == result2) << endl;
Run Code Online (Sandbox Code Playgroud)
输入:
1 3
2 6
Run Code Online (Sandbox Code Playgroud)
输出:
true
Run Code Online (Sandbox Code Playgroud)
所以我想知道
static_cast<double>(a) / b == static_cast<double>(k * a) / (k * b)
Run Code Online (Sandbox Code Playgroud)
永远是真的吗?
如果不,
int num1, num2;
cin >> num1 >> num2;
int num3, num4;
cin >> num3 >> num4;
int gcd1 = gcd(num1, num2);
int gcd2 = gcd(num3, num4);
double result1 = static_cast<double>(num1 / gcd1) / (num2 / gcd1);
double result2 = static_cast<double>(num3 / gcd2) / (num4 / gcd2);
cout.setf(ios::boolalpha);
cout << (result1 == result2) << endl;
Run Code Online (Sandbox Code Playgroud)
总是打印true输入a,b,k * a,k * b以NUM1,NUM2,NUM3,num4?
假设将IEEE-754二进制浮点算术与舍入到最近的关系到偶数规则一起使用,则除以下情况外,比较是正确的。
鉴于int num1,num2,num3,和num4在那里num3= ķ • num1和num4= ķ • num2对于一些实数ķ,存在以下几种情况static_cast<double>(num1) / num2 == static_cast<double>(num3) / num4可以评估为假:
num3和num4都为零,要么因为num1和为零,要么num2因为k为零。然后static_cast<double>(num3) / num4计算为NaN,NaN绝不等于任何东西,甚至不等于相同的NaN。num2为零,但num1不是,k为负。然后static_cast<double>(num1) / num2计算为+?要么 ??根据num1是正数还是负数,而static_cast<double>(num3) / num4相反则为?或+?分别,因此比较结果为false。int除符号位以外的位数宽于的有效位数时,double商因转换为时的舍入不相同而可能会有所不同double。例如,int可以为64位,而有效位数double为53位。假设num1是2 53 +1,num2是1,k是3,所以num32 54 +2 53 + 2 + 1 num4是3。然后,由于舍入,static_cast<double>(num1)产生2 53,static_cast<double>(num3)产生2 54 +2 53 +4,并且除法得到2 53和2 53 +2,它们不相等。num1或k • num2溢出int类型,则比较结果可能为false。除上述情况外,到的转换double是精确的,并且商是数学定义的(没有零除数)并且相等。在这些情况下,四舍五入规则要求两个除法产生相同的结果,因此比较结果为true。