gpt4 book ai didi

c++ - a/b == ka/kb 上没有浮点错误吗?

转载 作者:可可西里 更新时间:2023-11-01 17:39:53 24 4
gpt4 key购买 nike

这是我的简单代码。

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;

输入:

1 3
2 6

输出:

true

所以我想知道

static_cast<double>(a) / b == static_cast<double>(k * a) / (k * b)

总是正确的?

如果没有,

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;

总是在输入 abk * ak * 时打印 true b 到 num1, num2, num3, num4?

最佳答案

假设 IEEE-754 二进制浮点运算与舍入到最近的偶数规则一起使用,除以下情况外,比较都是正确的。

给定int num1 , num2 , num3 , 和 num4其中 num3 = knum1num4 = knum2对于一些实数k,有以下情况static_cast<double>(num1) / num2 == static_cast<double>(num3) / num4可能评估为假:

  • num3num4都是零,要么是因为 num1num2为零或因为 k 为零。那么static_cast<double>(num3) / num4计算结果为 NaN,而 NaN 永远不会与任何事物进行比较,甚至不会与相同的 NaN 进行比较。
  • num2为零但 num1不是,k 是负数。那么static_cast<double>(num1) / num2根据 num1 是否计算为 +∞ 或 −∞是正数还是负数,而static_cast<double>(num3) / num4分别计算为相反的 −∞ 或 +∞,因此比较计算为假。
  • 何时int , 不包括符号位,比 double 的有效数字宽, 由于转换为 double 时的舍入不同,商可能会有所不同.例如,int可能是 64 位,而 double有一个 53 位有效数字。假设 num1是 253+1, num2是 1,k 是 3,所以 num3是 254+253+2+1 和 num4是 3。然后,由于四舍五入,static_cast<double>(num1)产生 253static_cast<double>(num3)产生 254+253+4,除法产生 253 和 253+2,这不相等。
  • 如果knum1knum2溢出 int类型,比较结果可能为假。

除上述情况外,转换为 double是精确的,并且商是数学定义的(没有零除数)并且相等。在这些情况下,舍入规则要求两个除法产生相同的结果,因此比较结果为真。

关于c++ - a/b == ka/kb 上没有浮点错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56072406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com