2つの数値のうち、最小公倍数が2 * 10^9以下のものを計算するよう求めているCourseraクラスの割り当てを行っています。これを書いていますCでは226553150と1023473145のテストケースでコードを実行しています。答えは46374212988031350ですが、私は46374212988031344を取得していますが、これは6で終了しています!最低の共通倍数がCで倍精度になる
私は、以下に投稿したのと本質的に同じアプローチを使用するPythonで正しい解決法を書いていますが、数値精度の詳細は明らかに私のために扱われています。私はCに浮動小数点精度について何かを学ぶためにSOにこれを投稿します。そして、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;
}
このようなタスクで浮動小数点計算を使用しないでください。整数のみを使用してください。 – GMichael
この式 '(a * b)/ gcd(a、b)'は、 'double'よりも多くの桁を持つことになります(精度が必要な場合はlong longを使用してください) 。これが起こらないように式を改善する方法を考えてください。 –
doubleには〜15桁の精度しかありません。 46374212988031350を正確に格納することはできません。 –