当前位置: 首页 > 知识库问答 >
问题:

如何用二进制表示浮点。IEEE

葛修永
2023-03-14

与十进制相似,二进制数也可以表示浮点。现在我读到它可以有类似的浮动

0.50.10.250.010.1250.001...等等。但是,例如,0.1(十进制)如何用二进制表示?

另外,给定一个十进制浮点数,如何将其转换为十进制等价物(假设它不是那么简单)。

编辑:所以我知道更好的问题应该是;如何将十进制浮点转换为二进制?现在我知道我们乘以小数部分,直到它变成零。现在很有可能两个浮点可以有相同的表示,对吗?

共有2个答案

周伟泽
2023-03-14

另一个可能有用的观察结果。浮点数的“整数部分”以其“正常”形式存在于二进制中,例如,如果值为25.7482,则浮点数中的位为“11001”(25),后面的位表示分数(实际上,第一个“1”从未存储,它隐含在格式中)。如果从该数字中减去25.0,再乘以10,得到7.482,通过检查该值的整数部分,可以得到第一个小数位数“7”。

减去7.0,乘以10得到4.82,因此下一个数字“4”,依此类推。理论上,这个过程最终将以零结果结束,因为所有可以用浮点格式精确表示的值都有精确的十进制表示;然而,考虑到原始浮点的精度,“精确”结果的位数可能远远超过实际合理的位数(而且您可能需要额外的内部精度才能获得完全精确的结果,无论如何-您需要确保乘以10不会产生舍入错误)。

而且,对于像6.432e-200这样的数字,这种方法是可行的,但不是很有效(在第一个“6”出现之前,您将生成199个零)。

萧鸿轩
2023-03-14

给多少位?

0.1b:

0.00011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011...

正如你所看到的,这是一个近似值。

Binary                                          Decimal
0.1     == 1/2^1         == 1/2              == 0.5
0.01    == 1/2^2         == 1/4              == 0.25
0.11    == 1/2^1 + 1/2^2 == 1/2 + 1/4 == 3/4 == 0.75

基点后的每个位表示1/2^(位字符串后的位置)。

postion:   |1|2|3|4|5|6|7|
         0.|0|0|0|0|0|0|1|

所以0.0000001=1/2^7=0.0078125

代码

decimal_value = 0 
for i, bit in enumerate(binary_string):
    if bit == 1
         decimal_value += 1/2**i

更多信息,为什么十进制数不能用二进制表示?

 类似资料:
  • 我正在尝试将十六进制数据添加到十六进制字符串中,我需要使用它们的IEEE表示将浮点数添加到该字符串中。对于整数,这很简单: 其中value是数字的VARCHAR,params是包含十六进制字符串的VARCHAR。这个技巧适用于整数,但对于十进制,它会截断十进制部分,并将整数部分转换为十六进制整数。如果十进制的大小是固定的(java float或double),如何将值转换为十进制数的IEEE浮点表

  • 问题内容: 我在Python中有一个浮点值列表: 我想使用IEEE 32位编码将这些值写到二进制文件中。用Python做到这一点的最佳方法是什么?我的列表实际上包含大约200 MB的数据,因此最好“不要太慢”。 由于有5个值,所以我只想要一个20字节的文件作为输出。 问题答案: 亚历克斯绝对是对的,用这种方法做起来更有效: 然后像这样读取数组: 如果您事先知道项目数(例如,从文件大小或其他某种机制

  • 问题内容: 与浮点变量一起使用时出现问题(向下舍入/截断精度部分)。如何正确执行? 游乐场:https : //play.golang.org/p/49TjJwwEdEJ 输出: 我期望的输出是的,但实际产量。 问题答案: 原始问题: Golang中的楼层号不正确 将Math.Floor与float变量一起使用时出现问题(向下舍入/截断精度部分)。我该怎么做呢? 我预计1980 * 0.1 / 1

  • 问题内容: 我想将二进制数转换为浮点数。这是一种可能性的示例: 给我正确的输出: 不幸的是,我正在使用二进制 字符串 ,即,我需要类似的东西。 但是,这不起作用: 我尝试使用它将带引号的可打印数据块转换回二进制并返回二进制数据。但是最终,我得到了同样的错误: 我了解输出数字是整数的情况,但是如果我想获得数字12.546怎么办?那么该函数对二进制字符串的调用是什么样的? 问题答案: 另一种选择是做

  • 由于所有Java浮点数(浮点数和双精度浮点数)在内部都表示为位,因此我想找到一种有效的算法来转换表示该浮点数或双精度浮点数位的字符串,并将其转换为相应的浮点数-我找不到它的内置库函数,所以我求助于自己编写它。 长度为32的二进制字符串表示浮点,其中长度为64的二进制字符串将转换为double。所有浮点数都可以转换为双精度浮点数,而不会损失精度。将忽略空格。 示例 “0 10000000 10010

  • 假设我使用一个32位的浮点数来存储一个位串(不要问)。进一步假设我想将这个浮点数序列化为一个文件(作为一个浮点数),并在序列化之前对浮点数的十进制表示进行银行家四舍五入。当我将浮点数读回程序时,系统会(自然地)将其存储在一个32位的浮点数中,该浮点数尽可能接近序列化的数字。 在银行舍入后,我的序列化浮点数在数字上必须有多精确,才能确保序列化的浮点数在二进制上与读回的浮点数相等?