私は Lisp インタープリターに取り組んでおり、有理数を実装しています。1/3 のような数値を表すことができるという点で、double よりも優れていると思いました。結果を比較するためにいくつかの計算を行いました。私はその結果に驚いた
ダブルス付き
(* 3.0 (/ 1.0 3.0)) -> 1
(* 3.0 (/ 4.0 3.0)) -> 4
(* 81.0 (/ 1.0 81.0)) -> 1
比率で:
(* 3 (/ 1 3)) -> 1
(* 3 (/ 4 3)) -> 4
(* 81 (/ 1 81)) -> 1
浮動小数点演算の結果が正確なのはなぜですか? 精度が失われる必要があります。double は無限の桁数を格納できません。それとも何かが恋しいですか?
小さな C アプリケーションで簡単なテストを行いました。同じ結果です。
#include <stdio.h>
int main()
{
double a1 = 1, b1 = 3;
double a2 = 1, b2 = 81;
printf("result : %f\n", a1 / b1 * b1);
printf("result : %f\n", a2 / b2 * b2);
return 0;
}
出力は次のとおりです。
結果: 1.000000
結果: 1.000000
製造業
マーティン