c – 在双精度调用std :: remainder()之后检测到零
作者:互联网
我有这个代码:
double a = remainder(92.66, 0.01);
double b = remainder(92.87, 0.01);
事实证明a = -5.33948e-15和b = -2.61423e-15
这里的答案显然为零,如果我将这两个数相乘100并得到整数模数.但我希望能够使用双打来做到这一点.问题是,余数返回的数字大于DBL_EPSILON – 那么确定a或b是否为零的正确(最佳近似)方法是什么?
解决方法:
DBL_EPSILON是可以添加到1.0的最小数量.如果您的数字大于1.0,则该数字的epsilon也将按比例增大.只需将DBL_EPSILON乘以该数字即可获得阈值.
double a = remainder(92.66, 0.01);
if (a <= DBL_EPSILON * 92.66)
a = 0.0;
标签:modulus,c 来源: https://codeday.me/bug/20190830/1770053.html