如何从浮点数中提取二进分数

问题描述 投票:5回答:2

现在,浮点数和双精度数,尽管它们可以近似任何种类的数字(尽管可以说整数,但浮点数更精确),但它们在内部表示为二进制小数。例如,大约为十分之一

0.00011001100110011... (... only goes to computers precision, not infinity)

现在,具有有限位的二进制数中的任何数字都在数学中称为dyadic fraction表示(与p-adic无关)。这意味着您将其表示为分数,其中分母为2的幂。例如,假设我们的计算机近似为十分之一,即0.00011。相应的二进分数为3/323/(2^5),接近十分之一。现在是我的技术问题。 从浮点数中提取二进分数的最简单方法是什么。

注意事项:如果您想知道为什么要这样做,那是因为我正在Haskell中创建一个超现实的数字库。二进分数容易地转换成超现实数,这就是为什么将二进制容易地转换成二进数很方便的原因(不过我肯定会在有理数上遇到麻烦。)

haskell language-agnostic binary fractions
2个回答
5
投票
请小心,因为它不会简化尾数和指数。在这里,如果我评估floatRadix,我得到-52的指数和2 ^ 52的尾数,这不是我期望的。

而且,decodeFloat (1.0 :: Double)似乎会生成二进分数。不过,我不确定情况是否总是如此。


0
投票
二进制数字都是dyatic。小数点后的数字表示分母的2的幂,而没有小数点后计算的数字是分子。那是您的二进制数字。

对于二进制中的超现实数字有理想的表示形式。我称它们为“罪恶”。是这样的: 0s不是数字 1s为零 10秒是负数 11s是一100s是负数2101s是一半110s是一半111s是两个...等等...

因此,您看到标准的二进制计数与正弦计算的数值的超现实的出生顺序匹配。确定sinary数值的方法是将1表示为权利,将0表示为左边。我们以+/- 1开头,然后以1 / 2、1 / 4、1 / 8等开头。符号等于+表示1,-表示0。

例如:评估罪孽

toRational

超现实数字形成一棵二叉树,因此存在一种理想的二进制格式,根据左/右模式匹配它们在树上的位置以达到该数字。将1分配给右边,将0分配给左边。然后,超现实数字的出生顺序等于此表示形式的二进制计数。即:以正弦表示的第15个超现实数字值是标准二进制计数中的第15个数字表示。弦的值是超现实的标签值。从表示中去除开头的位,然后开始加+1或-1,具体取决于数字是第一个之后的1还是0。然后,一旦位翻转,就开始根据位值1/0使用+或-值对减半的值(1 / 2、1 / 4、1 / 8等)进行加法和减法。

我已经测试了这种格式,并且看起来效果很好。还有其他一些秘密...例如,任何正弦表示的左边和右边都是相同的二进制格式,尾巴分别剪裁到最后0和最后1。为了执行Conway要求的递归函数,不需要将十进制转换为dyatic。    
© www.soinside.com 2019 - 2024. All rights reserved.