1

別の無関係なインターネット フォーラムで、特定の数値の平方根が整数かどうかを確認する方法について質問がありました。それ自体は些細な宿題の質問ですが、すべての状況下で素朴なアプローチが正しいかどうか疑問に思い始めました。つまり、擬似コードでは次のようになります。

declare x, y as double
input x
y = sqrt(x)
if round(y) = y then
    output "Is integer"
else
    output "Isn't integer"

xそれx自体が整数 (または別の整数の 2 乗ではない整数) ではなく浮動小数点エラーのために整数にsqrt(x) なるような を入力することは可能ですか?

4

5 に答える 5

8

はい: x がMachine epsilonの端にある場合。x = 1.00...0001 を考えてみましょう。1.0 と同じではなく、バイナリ形式で表現できます。この数値の平方根は 1.0 となり、偽陽性になります。

于 2011-09-26T08:09:05.443 に答える
4

nextafter(1.0)1.0 を超える次の表現可能な浮動小数点数 ( C では)の平方根は、もっともらしく 1.0 に評価される可能性があります。

于 2011-09-26T08:09:17.377 に答える
0

xを1+イプシロンのようなフロートとしてフィードすることはもちろん機能します。ただし、非正方形の整数の場合、整数が十分に大きい場合は機能します。

例(c#)

ulong i = ulong.MaxValue; // 2^64-1, a non square integer.
double s = Math.Sqrt(i);  // Very nearly 2^32
bool same = Math.Round(s) == s; // true, s is close enough to 2^32.
于 2011-09-26T08:51:13.947 に答える
0

まず、数値が大きすぎて精度が小数点まで拡張されない場合、整数のみが得られますが、それらは正しくないため、そのケースは気にしないと思います。

正確な結果について: IEE754 フロートがある場合、これはかなり簡単にテストできるはずです。完全な整数平方である double を取得し、そのバイナリ表現を 1 ビットずつインクリメントまたはデクリメントしてから、平方根が正確な整数であるかどうかを確認します。標準の浮動小数点演算は、最後に 0.5 単位まで正確である必要があると私は信じています。そのため、整数が実際には表現可能な最も近い正しい平方根である可能性があります。

于 2011-09-26T08:10:51.497 に答える
0

もちろん:

double d = Math.Sqrt(4.000000000000001);
Console.WriteLine(d == 4);
Console.WriteLine(d == 2);

これにより、(C#)

False
True
于 2011-09-26T08:12:15.600 に答える