【问题标题】:Float and double precision in CC中的浮点和双精度
【发布时间】:2015-08-30 09:05:00
【问题描述】:

在 C 中,double 比 float 具有更高的精度,并且根据“C primeplus 第六版”一书(第 80 页),float 可以表示至少 6 个有效数字,double 可以表示至少 13 个有效数字。所以我试着用这个简单的例子来验证:

#include<stdio.h>

int main(void){
    float a = 3.3333333; // 7 significant digits
    double b = 3.33333333333333;// 14 significant digits

    printf("\nFloat:  %f\n", a);
    printf("Double: %f\n", b);

    return 0;
} 

这是这个程序的输出:

Float : 3.333333
Double: 3.333333

为什么双精度值与浮点值具有相同的精度,而不是显示更多有效数字?

【问题讨论】:

  • 根据cplusplus.com/reference/cstdio/printf,默认打印小数点后位数为6。
  • 例如见codepad.org/3XfCoo0s
  • 3.3333333 有 8 位有效数字,就像 33.333333333.333333333.3333 等。这就是它的工作原理。
  • 谢谢你们的帮助
  • doubleat least 10 有效十进制数字,而不是 13。long double 相同,可以与 double 相同。

标签: c precision


【解决方案1】:

大多数此类问题都可以通过查阅 C 标准来回答:

每个转换规范都由“%”字符引入...之后依次出现以下内容:

...

  • 一种可选精度,它给出...在 a、A、e、E、f 和 F 转换说明符的基数字符之后出现的位数。

描述f 说明符:

双参数应转换为“[-]ddd.ddd”样式的十进制表示法,其中基数字符后的位数等于精度规范。 如果精度缺失,则视为6

因此,通过简单地使用%f,您将指示printf. 之后打印六位数字。如果要查看更多位数,则需要指定精度:例如%.15f

【讨论】:

  • 谢谢你。我不知道,我是 C 编程新手,所以......如果你能给我提供 C 标准的链接,我将不胜感激。谢谢
【解决方案2】:

您需要显示更多有效数字。如果你这样做:

printf("\nFloat:  %.20f\n", a);
printf("Double: %.20f\n", b);

你会得到这个:

Float:  3.33333325386047363281
Double: 3.33333333333332992865 

【讨论】:

  • 双精度有 53 位尾数(假设前导 1 位,存储 52 位),即 16 位(~ 15.9546 位)。超出的数字与转换为字符串有关(将二进制小数转换为十进制小数)。
猜你喜欢
  • 2011-04-18
  • 2011-10-24
  • 2018-02-23
  • 2018-07-06
  • 1970-01-01
  • 2023-03-18
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多