为什么很少使用浮点数的十六进制表示?
不是像0x0.01
那样写它们会有助于避免一些意外,例如0.01突然变成0.010000000000
某些东西吗?
十进制pi应该多长时间才能准确?
似乎有这条指令FLDPI,它将pi加载到协处理器中,为什么你必须在代码中编写pi?手臂有相同的说明吗?
答案 0 :(得分:1)
好的,关于“应该how多久”的问题。这些功能:
int main (void){printf("%.80f\n\n", 0x3.243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98p0 );}
int main (void){printf("%.80f\n\n", 3.14159265358979323846264338327950288419716939937510582097494459 );}
int main (void){printf("%.80f\n\n", 3.141592653589793 );}
打印完全相同的数字:
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000
如果变短,结果会有所不同。
答案 1 :(得分:1)
我一直使用C99的十六进制表示法来表示浮点数,包括输入和输出。
使用十进制格式D.DDDDDDDDDDDDDDDDEXXX(小数点后十六位)保证符号唯一标识任何double
,包括最接近π的双精度。
像C这样的语言是可移植的,不应该依赖于某个特定指令集可以做什么。旧的80位浮点指令也已经过时了,尽管它们对于使用80位long double
显式计算的程序仍然有用。
在π的特殊情况下,3.141592653589793
是获得正确double
的最小十进制表示。
另请注意,当程序中的常量完全是指令将加载的常量时,编译器始终可以生成指令FLDPI
。但是,80位FPU已经过时,只能由现代编译器用于长双精度计算。经过测试,即使将FLDPI
移动到0x3.243F6A8885A308D313198A2E03707344
,GCC和Clang都不会生成long double
指令。 Lame ......我几乎想填写错误报告。
0x
和p
标记是必要的,以避免使用整数表示法出现歧义。在十六进制中,它非常简单:每个十六进制数字代表4位,普通双数字形式为1.< 52二进制数字>。因此,1.
之后正好有13个十六进制数字。在十进制中,识别double
所需的最多16位数字。要自己观察,请执行:
#include <stdio.h>
#include <math.h>
…
printf("%.16e\n%.16e\n", 1.0, nextafter(1.0, 2.0));
看到更少的数字会引起混淆。
答案 2 :(得分:0)
考虑你在日常生活中的经历:你是否处理并遇到十进制的实数或指定给任何其他基数?
由于四舍五入,你仍然会出现惊喜,无论如何都会出现带有浮点值的计算中的近似误差。