基数が2のときの動作がおかしい

基数が2のときの動作がおかしい.2は素数なので(n-1)/zの値はきっちりpにならなくてはならないはずなのに,端数が出ている.⇒2^kでk=7の場合と,14の場合で不一致が発生している.⇒2^7をダンプして末尾ゼロを目測でカウントしてみたところ,127あった.この数字は正しい.TrailingZeros が返してくる値は126で1小さい.どこかで桁落ちなど起きているのだろうか?

primeExponentが返してくる値が,126になっている.

n=128, p=2, k=6, e=64+32+16+8+4+2=126

どうも,対数関数のlogが誤差を出しているようだ.

p=2 n=128 log =6.999999999999999999999999999999999999999999999999999999999999999999999999999931

この値のfloorを取ると6になってしまう.これは本来7でなくてはならないのではないだろうか?2^7=128だから,log_2(128)=7でなくてはならない.これを回避するにはどうすればよいか?logの引数をBigFloatにしてみたが,効果なし.logの値をBigFloatで受けるようにしてみたが,同じ.BigFloatの精度は256もあるのに,計算値は80桁くらいしかない.⇒やった!primeExponentの冒頭でsetprecision(BigFloat, 512)を実行したら,log=

7.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006

という値が取り出せた.これでrも1.0に落ち着いた.とりあえず,これでよいということにしておこう.⇒この計算誤差は他の数値でも出ている可能性がある.チェックしておこう.⇒数値には変化はなかった.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA