0

次のコードは、入力された数値が26の累乗であるかどうかを確認するためのものです。ローカルホストでは、比較はtrueであるはずのときにfalseと評価されますが、ライブphpサーバーで実行されている場合は期待どおりに機能します。

#there is an html text input
$foo = $_POST['someval'];

if(intval(log($foo, 26)) == floatval(log($foo, 26))) {
   echo 'yup, that there number is a power of 26';
}
else {
   echo 'nope, definitely not a power of 26';
}

ローカルホストでは、「if」が時々trueと評価されることに注意してください。これは、26の1乗おきに発生します(たとえば、26が真、676(26の2乗)が偽、17576(26の3乗)が真になります)。ただし、ライブサーバーで実行している場合は、すべてが期待どおりに機能し、「if」は26のすべての累乗に対してtrueと評価されます。

この不一致の原因がわかりません。ライブサーバーはPHP5.3.8を実行しています。それぞれPHP5.3.60と5.3.10を実行している2つの異なるローカルスタック(mampとampps)を試しましたが、両方で同じことが発生します。

また、「if」ステートメントの外で計算が行われ、運がないようにコードを記述してみました。

コードは(ライブで)想定されている場所で機能するため、これは優先度の高い問題ではありませんが、不一致があることを私は悩ませています。何が起こっているのか、または数値が26の累乗であるかどうかを確認するためのより良い方法があるかどうかを教えてください。

4

1 に答える 1

2

浮動小数点の丸めの問題と、正確性の約束の欠如(log($foo, 26)おそらく、浮動小数点の除算を含む、として内部的に計算されlog($foo)/log(26)ます)のため、これは、ましてや、作業に頼るべきようなもののようには聞こえません。異なるシステム間で。代わりにこれをお勧めします:

$foo == pow(26, (int)round(log($foo, 26)))

$fooそもそもPHP整数型に収まる限り、これは常に正確である必要があります。PHPpowは、両方の引数が整数であり、結果が整数の範囲内にある場合、結果が整数になることを約束しています。の基数26の対数を見つけ、$fooそれを丸め、26をその累乗に上げることにより、このコードは基本的に26の最も近い累乗を見つけ、$fooその累乗を直接比較して$foo、それらが等しいかどうかを確認できます。

于 2012-04-22T01:18:30.580 に答える