リクエストに応じて:
1 つ目は のリストを示しますがShowS
、どうすればString
からを作成できShowS
ますか?
ShowS
は の型シノニムであるため、関数を に適用してString -> String
を取得します。関数は、最終引数の前にいくつかを追加する関数を生成するため(基本的には差分リストです。多くの関連関数は、効率の理由から、いくつかの名前を付けると、そのような - 、、を生成します)、最終引数の自然な選択は空です。、 それでString
String
showXFloat
String
String
show
shows
showChar
showString
String
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 ビットの精度により、おおよそ次のようになります。Double
d
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
正確な (または十分に正確な有限の) 文字列表現を使用できます。Rational
1 % d
Rational