どちらも 2 * 10 ^ 9 を超えない 2 つの数値の最小公倍数を計算するように求められる Coursera クラスの割り当てを行っています。これを 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;
}