根据要求:
第一个给出了一个列表,ShowS
我该如何制作?String
ShowS
由于ShowS
是 的类型同义词String -> String
,因此您可以String
通过将函数应用于 a 来获得 a String
。由于showXFloat
函数产生一个函数,该函数String
在最后一个String
参数前面加上一些(基本上是一个差异列表;许多show
相关函数产生这样的 - shows
, showChar
, showString
, 仅举几例 -出于效率的原因),最后一个参数的自然选择是空的String
, 所以
listOfLongDeci = [showFFloat Nothing (1/a) "" | a<-[2..1000], length (show (1/a)) > 7]
生成String
s 的列表,正确舍入到1/a
非科学计数法中数字的十进制表示形式。
如何使用其中任何一个来创建具有非科学记数法的字符串列表?(欧拉 26)
第一部分已经回答了,但是这些表示并不能帮助你解决Project Euler 的问题 26,
找出其小数部分中包含最长循环周期d < 1000
的值。1/d
ADouble
有 53 位精度(52 位显式有效位加上 1 个隐藏位用于归一化数字,没有隐藏位,因此次正规数的精度为 52 位或更少),并且该数字1/d
不能精确表示为 aDouble
除非d
是幂2. 53 位的精度给你大致
Prelude> 53 * log 2 / log 10
15.954589770191001
精度的有效十进制数字,因此从第一个非零数字开始,您有 15 或 16 位数字,您可以期望对 fraction 的精确 [终止或重复] 十进制扩展是正确的1/d
,除此之外,扩展不同。
例如,1/71
有一个长度为 35 的循环周期01408450704225352112676056338028169
(到目前为止不是要考虑的范围中最长的)。最接近的可表示Double
是1/71
0.01408450704225352144438598855913369334302842617034912109375 = 8119165525400331 / (2^59)
其中前 17 位有效数字是正确的(0.014084507042253521
也是showFFloat Nothing (1/71) ""
给你的)。
要在 的十进制扩展中找到最长的重复循环1/d
,您可以使用数字的精确(或足够精确的有限)字符串表示Rational
,1 % d
或者更好的是,使用纯整数算术(使用长除法计算十进制扩展)而不涉及Rational
.