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

印刷浮子,保持精度

楚方伟
2023-03-14

我正在编写一个程序,打印浮点文字,以便在另一个程序中使用。

我需要打印多少位数才能保持原始浮点数的精度?

由于浮点数有24 *(log(2)/log(10))= 7.2247199十进制数字的精度,我最初的想法是打印8位数字应该足够了。但是,如果我运气不好,那0.2247199会分布在7位有效数字的左侧和右侧,所以我应该打印9位十进制数字。

我的分析正确吗?9位十进制数字对所有情况都足够吗?如printf(“%.9g”,x)

有没有标准函数可以将浮点数转换为具有该值所需的最小十进制位数的字符串,在7或8就足够的情况下,这样我就不会打印不必要的数字?

注意:我不能使用十六进制浮点文字,因为标准C不支持它们。


共有3个答案

璩正志
2023-03-14

如果您有一个符合C99的C库(如果您的浮点类型的基是2的幂:),printfformat character%a可以打印浮点值,而不需要十六进制形式的精度,scanfstrod

慎风畔
2023-03-14

24 * (日志(2) / 日志(10)) = 7.2247199

这很能代表这个问题。用0.0000001位的精度来表达有效数字的数量是没有任何意义的。你把数字转换成文本是为了人类的利益,而不是机器的利益。人类不在乎,更愿意,如果你写

24 * (对数(2) / 对数(10)) = 7

试图显示8个有效数字只会产生随机的噪声数字。由于浮点误差会在计算中累积,所以7已经太多了。最重要的是,使用合理的测量单位打印数字。人们对毫米、克、磅、英寸等感兴趣。没有建筑师会关心窗户的尺寸是否超过1毫米。没有窗户制造厂会promise窗户的尺寸如此准确。

最后但并非最不重要的一点是,您不能忽视您输入到程序中的数字的准确性。无法测量空载欧洲燕子低至7位数的速度。它大约是每秒11米,最多2位数。因此,在这种速度上执行计算并打印具有更多有效数字的结果会产生荒谬的结果,这些结果保证了不存在的准确性。

伯和蔼
2023-03-14

为了保证二进制文件-


The original binary value will be preserved by converting to decimal and back again using:[10]

    5 decimal digits for binary16
    9 decimal digits for binary32
    17 decimal digits for binary64
    36 decimal digits for binary128

For other binary formats the required number of decimal digits is

    1 + ceiling(p*log10(2)) 

where p is the number of significant bits in the binary format, e.g. 24 bits for binary32.

在C #中,可以用于这些转换的函数是snprintf()和strtof/strtod/strtold()。

当然,在某些情况下,甚至可以使用更多的数字(不,它们并不总是“噪音”,这取决于十进制转换例程(如snprintf())的实现)。例如,考虑打印并元分数。

 类似资料:
  • 问题内容: 上面的代码显示: 我如何才能仅打印(或将其用作)11.4? 问题答案: 正如其他人提到的那样,如果您想要精确表示为11.4,则可能要使用该类。 现在,对造成这种情况的原因进行一些解释: Java中的和类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。 更具体地说,双精度浮点值(例如doubletype)是64位值,其中: 1位表示符号(正或负)。 指数为11位。 52位为有效数

  • 问题内容: 上面的代码打印: 我如何才能仅打印(或将其用作)11.4? 问题答案: 正如其他人所提到的,如果你想要精确表示为11.4,则可能要使用该类。 现在,对造成这种情况的原因进行一些解释: Java中的和类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。 更具体地说,诸如类型的双精度浮点值是64位值,其中: 1位表示符号(正或负)。 指数为11位。 52位为有效数字(小数部分为二进制

  • 我试图在x86_64汇编中打印一个浮点数,但它只是将值打印为零。 关于这一点已经有几个问题了。一个问题似乎通过确保您设置在%al中使用的向量寄存器的数量得到了解决。另一个表明您需要16个字节的堆栈对齐。但是,我正在做这两件事,但仍然没有得到正确的输出。 这是我的程序:

  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

  • 在浮动范围组件上使用ngModel时出现运行时错误。:未指定名称属性的窗体控件没有值访问器 有什么解决方案可以在这两个组件之间绑定ngModel数据吗?