使用 printf 打印高精度双精度数,使用 GCC 编译

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

在C程序中使用printf打印并使用

%.20f
指定小数点后需要多少个字符时,它只给我15个字符,其余为0。我使用GCC使用命令
gcc -o main main.c
进行编译有没有编译时我应该添加标志吗?

我有这个简单的程序

#include <stdlib.h>
#include <stdio.h>

double a = 233.12376886221625447234;

int main ()
{
    printf("a = %.20f\r\n",a);
    printf("a = %f\r\n",a);
}

它的输出是

a = 233.12376886221625000000
a = 233.123769

我用命令编译

gcc -o main main.c

c gcc printf double precision
2个回答
0
投票

使用

long double
数据类型打印较大的变量,格式说明符为
%Lf
Code example Output


0
投票

double
可以精确地编码大约264不同的有限值。

233.12376886221625447234
不是 其中之一。

最接近的 2 个

double
是一些整数乘以 2 的幂,例如:

233.1237688622162_522733560763299465179443359375
233.1237688622162_5447234  // OP's code
233.1237688622162_80695065506733953952789306640625

更好的问题是为什么 233.1237688622162_522733560763299465179443359375 被打印为

233.1237688622162500000

// OP's output
//3 4567890123456 7890123
233.1237688622162_5000000

由于 OP 的输出产生了上述结果,仅反映了如何呈现如此精确的数字的实现选择。

C 没有指定超出一定位数后应打印的内容。 OP 确实看到了

DBL_DECIMAL_DIG
(17) significant 数字,这至少满足了 C 的要求。让我们得出结论,OP 的实现有些薄弱。

IIRC、IEEE 754 要求

DBL_DECIMAL_DIG + 3
数字。


使用

%a
来打印精确值。

#include <stdio.h>
#include <stdint.h>
#include <math.h>

int main(void) {
  double a = 233.12376886221625447234;
  printf("%.50g\n", a);
  puts("233.12376886221625447234");
  printf("%.50g\n", nextafter(a,a*2));
  printf("%a\n", a);
}

样本输出

233.1237688622162522733560763299465179443359375
233.12376886221625447234
233.123768862216280695065506733953952789306640625
0x1.d23f5ea1def6cp+7
© www.soinside.com 2019 - 2024. All rights reserved.