在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
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