我正在为 Coursera 课程做作业,要求我计算两个数字的最小公倍数,其中任何一个都不大于 2 * 10 ^ 9。我正在用 C 语言编写它,并且正在运行我的代码编号为 226553150 和 1023473145 的测试用例。答案是 46374212988031350,但我得到的是 46374212988031344,相差 6!
我已经用 Python 编写了一个正确的解决方案,它使用的方法与我在下面发布的方法基本相同,但数值精度的细节显然已经为我处理好了。我将此发布到 SO 以了解 C 中的浮点精度,因为我在互联网上看到的大多数问题以及关于 LCM 的 SO 仅涉及整数。
这是我正在编译的代码gcc -pipe -O2 -std=c11 lcm.c
:
#include <stdio.h>
#include <math.h>
double gcd(double a, double b) {
if (b == 0) {
return a;
}
return gcd(b, fmod(a,b));
}
double lcm(double a, double b) {
return (a * b) / gcd(a,b);
}
int main() {
double a;
double b;
scanf("%lf %lf", &a, &b);
printf("%.0lf\n", lcm(a,b));
return 0;
}