从双精度列表中创建字符串列表,非科学记数法

时间:2013-05-22 12:37:03

标签: haskell floating-point

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]
  • 第一个给出一个ShowS列表,如何从showS创建一个字符串?
  • 第二个列出了科学记数法
  • 第3只列出了清单 双打

如何使用其中任何一个来创建非科学记数法的字符串列表? (Euler 26

1 个答案:

答案 0 :(得分:2)

As requested

  

第一个提供了ShowS的列表,如何从String创建ShowS

由于ShowSString -> String的类型同义词,因此您可以通过将该函数应用于String来获得String。由于showXFloat函数会生成一个函数,该函数会将一些String添加到最终String参数(基本上是一个差异列表;许多show - 相关的函数会产生这样的函数 - {{1} },showsshowChar,仅举几例 - for reasons of efficiency),最终参数的自然选择是空showString,所以

String

以非科学记数法生成listOfLongDeci = [showFFloat Nothing (1/a) "" | a<-[2..1000], length (show (1/a)) > 7] s的列表,正确舍入到数字String的十进制表示的近似值。

  

如何使用其中任何一个来创建非科学记数法的字符串列表? (euler 26)

第一部分已经回答,但这些陈述无法帮助您解决Project Euler的Problem 26

  

查找1/a的值,其d < 1000包含小数部分中最长的重复周期。

A 1/d具有53位精度(有效数为52个显式位,加上归一化数字的一个隐藏位,没有隐藏位,因此对于次正规数,精度为52或更少),数字为{{除非Double是2的幂,否则1}}无法准确表示为1/d。53位精度为您提供粗略

Double

精确度的有效十进制数字,因此从第一个非零数字开始,您可以获得15或16位数,这些数字对于分数d的精确[终止或重复]十进制扩展是正确的,超出那个,扩张不同。

例如,Prelude> 53 * log 2 / log 10 15.954589770191001 具有长度为35的重复周期1/d(到目前为止不是要考虑的范围中最长的周期)。最接近可表示的1/7101408450704225352112676056338028169

Double

其中前17个有效数字是正确的(1/71也是0.01408450704225352144438598855913369334302842617034912109375 = 8119165525400331 / (2^59) 给你的。)

要在0.014084507042253521的十进制扩展中找到最长的循环周期,您可以使用showFFloat Nothing (1/71) ""数字1/d的精确(或足够精确的有限)字符串表示,或者更好,使用纯整数运算(使用长除法计算十进制扩展),而不涉及Rational