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

浮点文字到IEEE-754二进制模式跨编译器的一致性

卫寒
2023-03-14

这里有一个关于“跨平台浮点一致性”的问题和答案,但它只讨论运行时一致性(IEEE浮点)。

我对编译时一致性感兴趣,特别是:

如果我有一个特定的浮点数,并想在我的源代码中加入一个浮点文字,并让每个针对IEEE-754架构的编译器将其编译成与浮点(或双精度)相同的位模式:我需要做什么?

  • 一定数量的数字

(我知道多年来一直存在争议,关于如何将浮点值从IEEE格式往返到十进制表示法,然后再往返,我不知道这是否是浮点文字和编译器(以及C标准)的问题。)

共有1个答案

毋澄邈
2023-03-14

您可以利用这样一个事实,即虽然每个十进制浮点数在IEEE-754浮点表示法(使用二进制)中没有精确表示,但每个IEEE浮点数都有作为十进制浮点数的精确表示。

C语言规范在(“浮点文字”)中讨论了浮点文字。在描述了浮点文字的所有部分之后,它说

如果缩放值在其类型的可表示值范围内,则结果是缩放值(如果可表示),否则以实现定义的方式选择最接近缩放值的较大或较小的可表示值。

(这项工作在C 11晚期工作文件N3242和2018年的N4741中都是相同的。我在CPPFerence中找不到这一描述。)

这意味着像0.1这样的数字可以略小于或略大于所需值,其他像0.5或0.000000000 931322574615478515625(2-30)的数字在所有一致编译器中都具有该值。

你需要取你的十进制数,在它之前或之后获得一个IEEE-754表示,然后将该表示转换为等效的十进制数。一旦你有了它,所有支持IEEE-754浮点格式的符合标准的编译器应该给你一个完全相同的常数。

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

  • Wiki双精度浮点格式表示: 这给出了15–17位有效小数的精度。如果将最多包含15个有效数字的十进制字符串转换为IEEE 754双精度表示形式,然后再转换回包含相同有效数字的字符串,那么最终的字符串应该与原始字符串匹配。如果将IEEE 754双精度转换为至少有17位有效数字的十进制字符串,然后再转换回double,则最终数字必须与原始数字匹配。 有人能给我一些例子来说明转换如何与原始匹配,以及在

  • 我目前正在尝试将以下IEEE 754十六进制数0x805c00f0转换为其十进制等效值,根据在线转换器,该等效值约为-8.44920195816662938E-39。在纸上一步一步地计算出来,我得到以下结果: 805c00f0=1000 0000 0101 1100 0000 1111 0000最左边的1表示数字为负数。接下来的8位000 0000 0表示减去偏差后的指数为-127。剩下的是101

  • 与十进制相似,二进制数也可以表示浮点。现在我读到它可以有类似的浮动 :,:,:...等等。但是,例如,0.1(十进制)如何用二进制表示? 另外,给定一个十进制浮点数,如何将其转换为十进制等价物(假设它不是那么简单)。 编辑:所以我知道更好的问题应该是;如何将十进制浮点转换为二进制?现在我知道我们乘以小数部分,直到它变成零。现在很有可能两个浮点可以有相同的表示,对吗?

  • 问题内容: 我正在尝试将以下十六进制字符串转换为“ 41630D54FFF68872”到9988776.0(float-64)。 使用单精度float-32,我可以这样做: 但这会引发:java.lang.NumberFormatException:使用上面的64位十六进制时,Infinite或NaN。 如何将十六进制转换为使用64位IEEE-754编码的双精度浮点数? 谢谢 问题答案: 您需要双

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