C ++场景:我有两个类型分别为double a
和b
的变量。
目标:a
应设置为小于b
的a
的最接近倍数。
第一种方法:使用fmod()
或remainder()
获得r
。然后执行a = a - r
。我知道,由于在内存fmod()
或remainder()
中使用十进制数字表示,因此无法保证100%的准确性。在测试中,我发现我根本无法使用fmod()
,因为其结果的差异太不可预测了(至少据我所知)。关于这个现象有很多问题和讨论。那有什么我可以做的仍然使用fmod()
吗?“某物”是指一些技巧,类似于通过使用double值来检查a
是否等于b
。
EPSILON = 0.005; if (std::abs(a-b) < EPSILON) std::cout << "equal" << '\n';
我的第二种方法行得通,但似乎不是很优雅。我只是从
b
中减去a
,直到没有什么可减去的了:
double findRemainder(double x, double y) { double rest; if (y > x) { double temp = x; x = y; y = temp; } while (x > y) { rest = x - y; x = x - y; } return rest; } int main() { typedef std::numeric_limits<double> dbl; std::cout.precision(dbl::max_digits10); double a = 13.78, b = 2.2, r = 0; r = findRemainder(a, b); return 0; }
对我有什么建议吗?
C ++场景:我有两个类型为double a和b的变量。目标:a应设置为小于a的b的最接近倍数。第一种方法:使用fmod()或restder()获得r。然后做一个= ...
嗯,确实存在定义问题,因为浮点的大多数倍数无法精确表示,除非乘数是2的幂。