私は、円と線 ( Constructable Numbers ) を含む 2D ユークリッド幾何学の二次制約を解決し、結果をグラフィカルに表現するためのアプリケーションに取り組んでいます。このような問題を二分木で表すことに関するこの論文を見つけましたが、実装の問題に直面しています。
a + b*sqrt(c)
より小さい、より大きい、等しいという標準的な関係演算の形式の数値を比較する必要があります。c
私のアプリケーションのの値は、、、、、、、またはに制限さ2
れています。例 (C に似た疑似コードは、"to the power of" 演算子です):3
5
6
10
15
30
^
boolean CompareConstructibleNumbers(int a1, b1, c1, a2, b2, c2)
{
return a1plusb1sqrtc1_is_greater_than_a2plusb2sqrtc2 =
4 * ((a1 - a2)^2) * (b1^2) * c1
> ((b2^2) * c2 - (b1^2) * c1 - (a1 - a2)^2)^2;
// Not sure if I have the direction right for >
}
この単純な実装では、何度も乗算する必要があるため、32 ビット整数は 64 ビット整数になり、次に 128 ビットなどになります。比較。
また、フロートを使用しないことを好み、フロートとして直接計算しようとする際の丸め誤差のリスクを回避したいと考えていますsqrt(c)
。このアプリケーションには正確な計算が必要であり、必ずしも無限の精度ではありませんが、丸め誤差を回避して正しい結果を保証したいと考えています。
a + b * sqrt(c)
巨大な中間整数値を必要とせずに、フォームの構成可能な数値を比較するにはどうすればよいですか? a
との初期値b
は 32 ビットの範囲です。
****UPDATE**** 返信ありがとうございます。連分数を追求するという提案に続いて、基本再帰式を使用して、平方根の任意の正確な近似値を生成することができました。
また、実数の近似値と固定小数点表現を整数で乗算することによる誤差の累積について説明しているこの論文も見つけました。幸いなことに、私が関心のあるすべての平方根の整数部分は最大で 6 (必要なのは 3 ビットのみ) であるため、近似のために小数部分を表すために使用できるビットがたくさんあります。32 ビット整数による乗算では、乗算後に誤差を 1 ビットに保つために、Q3.32ビットの最小固定小数点近似が必要です。
したがって、53 ビットの精度double
は平方根の十分に正確な近似値を格納するのに十分ですが、32 ビットの整数を掛けた後の結果を格納するには十分ではありません。エラー。c
と 32ビット整数の 64 ビット整数 (Q16.48 など) の固定小数点表現をb
使用して、96 ビットまたは 128 ビットの数値でマルチワード演算を使用して、十分なエラーを発生させずに比較を行う予定です。結果。これらの 7 平方根のみを使用する構成可能な数を比較するには、これで十分な精度であると確信していますが、セカンドオピニオンに興味があります。何かご意見は?