0
listOfLongDeci = [showFFloat Nothing (1/a) | a<-[2..1000], length (show (1/a)) > 7]

listOfLongDeci2 = [show (1/a) | a<-[2..1000], length (show (1/a)) > 7]

listOfLongDeci3 = [(1/a) | a<-[2..1000], length (show (1/a)) > 7]
  • 1 つ目は ShowS のリストですが、showS から文字列を作成するにはどうすればよいですか?
  • 2番目は科学表記法のリストを与える
  • 3番目はdoubleのリストのみを提供します

これらのいずれかを使用して、非科学的表記法で文字列のリストを作成するにはどうすればよいですか? (オイラー 26 )

4

1 に答える 1

2

リクエストに応じて:

1 つ目は のリストを示しますがShowS、どうすればStringからを作成できShowSますか?

ShowSは の型シノニムであるため、関数を に適用してString -> Stringを取得します。関数は、最終引数の前にいくつかを追加する関数を生成するため(基本的には差分リストです。多くの関連関数は、効率の理由から、いくつかの名前を付けると、そのような - 、、を生成します)、最終引数の自然な選択は空です。、 それでStringStringshowXFloatStringStringshowshowsshowCharshowStringString

listOfLongDeci = [showFFloat Nothing (1/a) "" | a<-[2..1000], length (show (1/a)) > 7]

s のリストを生成し、非科学的表記法Stringでの数値の 10 進数表現に正しく丸められた近似値を生成します。1/a

これらのいずれかを使用して、非科学的表記法で文字列のリストを作成するにはどうすればよいですか? (オイラー 26)

最初の部分は回答済みですが、これらの表現はProject Euler の問題 26を解決するのに役立ちません。

小数部分に最も長い反復サイクルd < 1000を含む forの値を見つけます。1/d

ADoubleは 53 ビットの精度 (仮数の明示的な 52 ビットと、正規化された数値の非表示ビット 1 つを足したもので、非正規数の精度は 52 ビット以下) であり、が累乗でない限り、数値1/dを a として正確に表現することはできません。2 の 53 ビットの精度により、おおよそ次のようになります。Doubled

Prelude> 53 * log 2 / log 10
15.954589770191001

したがって、最初のゼロ以外の桁から、分数の正確な[終了または繰り返し]小数展開に対して正しいと期待できる15または16桁があり1/dます。それを超えると、展開は異なります。

たとえば、長さ 351/71の繰り返しサイクル01408450704225352112676056338028169があります (考慮される範囲で最長ではありません)。表現可能な最も近いDoubleもの1/71

0.01408450704225352144438598855913369334302842617034912109375 = 8119165525400331 / (2^59)

そのうち、最初の 17 桁の有効桁数は正しいです (また、これによって得られる0.014084507042253521ものもありshowFFloat Nothing (1/71) ""ます)。

の 10 進展開で最も長い反復サイクルを見つけるには、数値の1/d正確な (または十分に正確な有限の) 文字列表現を使用できます。Rational1 % dRational

于 2013-05-24T09:02:03.217 に答える