【发布时间】:2019-05-08 01:45:11
【问题描述】:
我试图在 C++ 中找到一个双重除以另一个的次数,而我发现这样做的唯一函数是 remquo。但是在使用它时,它并没有给出预期的结果,当它们应该是从 0 到 20 时,结果商只在 0 到 3 之间。
较小尺寸的双精度数工作是否对更精确的浮点数有问题?
int quotient;
double remainder = remquo((coordX+maxX), tileSizeX, "ient);
cout << coordX+maxX << " / " << tileSizeX << " = " << quotient << " r " << remainder << endl;
return quotient;
在这种情况下,maxX 将为 0.773,coordX 将是一个介于 -0.773 到 0.773 之间的数字,最后 tileSizeX 约为 0.073619。
这里是 cout 调用的一些输出:
0.773 / 0.073619 = 2 r 0.0368095 但 0.073619 * 2 + 0.0368095 = 0.1840475,与我预期的 0.773 相差甚远。
0.085 / 0.073619 = 0 r 0.011381
0.181 / 0.073619 = 2 r 0.0337619
0.433 / 0.073619 = 3 r -0.00871429
1.269 / 0.073619 = 0 r 0.0174762
余数看起来总是对的,但商几乎从来都不是。有什么我不明白的地方吗?
【问题讨论】:
-
请发MCVE 并提供编译器版本和操作系统
-
查看documentation,此外,x/y 的符号和至少最后三位将按原样存储,足以确定结果的八分圆期间。。 3 位不是很多。
-
另外余数定义为 该函数计算的除法运算 x/y 的 IEEE 浮点余数正好是值 x - n*y,其中值 n 是最接近精确值 x/y 的整数值。当 |n-x/y| = ½,值 n 被选择为偶数。,这不是您要处理的值。
-
MCVE 很重要,因为我认为您的代码中没有显示舍入错误; 0.773/0.073619 实际上比 10.5 稍微大一点,所以余数应该是负数,但你显示的是正数余数(所以我怀疑除数不完全是显示的值)
-
注意。我没有标记为骗子(其他 q 并不是真正的骗子)我 vtc 不包括 MCVE。您可以通过包含 MCVE 并粘贴结果副本来重新打开。
标签: c++ c++11 floating-point double division