首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么浮点数的十六进制表示法很少使用?(还有几个问题)

为什么浮点数的十六进制表示法很少使用?(还有几个问题)
EN

Stack Overflow用户
提问于 2013-09-02 22:04:31
回答 3查看 149关注 0票数 0

为什么浮点数的十六进制表示法很少使用?

0x0.01一样编写它们不是可以帮助避免一些意外吗,比如0.01突然变成了0.010000000000

小数圆周率应该有多长才算准确?

似乎有这样一条指令FLDPI,它将pi直接加载到协处理器中,那么为什么要在代码中编写pi呢?arm也有同样的使用说明吗?

EN

回答 3

Stack Overflow用户

发布于 2013-09-03 00:05:05

好的,关于“π应该持续多久”这个问题。这些函数:

代码语言:javascript
复制
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 );}

打印完全相同的数字:

代码语言:javascript
复制
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000

如果它变得更短,结果会有所不同。

票数 1
EN

Stack Overflow用户

发布于 2013-09-03 04:06:47

我一直使用C99的十六进制表示法来表示浮点数,无论是输入还是输出。

使用十进制格式D.DDDDDDDDDDDDDDDDEXXX (小数点后的十六位数)可确保该表示法唯一标识任何double,包括最接近π的双精度。

像C这样的语言应该是可移植的,不应该依赖于一个特定的指令集可以做什么。旧的80位浮点指令也已经过时了,尽管它们对于使用80位long double显式计算的程序仍然很有用。在π的特殊情况下,3.141592653589793是获得正确double的最小十进制表示。此外,请注意,当程序中的常量恰好是指令加载的常量时,编译器始终可以生成指令FLDPI。然而,同样,80位FPU已经过时了,应该只被现代编译器用于长时间的双重计算。经过测试,即使在将0x3.243F6A8885A308D313198A2E03707344移动到long double时,GCC和Clang也不会生成FLDPI指令。差劲的…我几乎想要填写一份bug报告。

0xp标记对于避免整数表示法的多义性是必要的。在十六进制中,这很简单:每个十六进制数字代表4位,一个普通的双精度数的形式是1.<52 binary digits>。因此,1.后面的13个十六进制数字非常重要。以十进制表示,标识double所需的数字最多为16位。要自己观察,请执行以下命令:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>
…
printf("%.16e\n%.16e\n", 1.0, nextafter(1.0, 2.0));

看到较少的数字会造成混乱。

票数 1
EN

Stack Overflow用户

发布于 2013-09-02 22:09:56

考虑一下你在日常生活中的经历:你处理和遇到过十进制或指定为其他基数的实数吗?

你仍然会感到惊讶,因为在使用浮点值计算时,舍入和近似误差无论如何都会发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18575100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档