Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 固定大小浮点类型_C++_C_Boost_Floating Point - Fatal编程技术网

C++ 固定大小浮点类型

C++ 固定大小浮点类型,c++,c,boost,floating-point,C++,C,Boost,Floating Point,在stdint.h(C99)和cstdint(C++0x)头中,除其他外,还有类型int32\t 是否有类似的固定大小浮点类型?类似于 FualAT32, > P>这一点目前在C或C++标准中都没有。事实上,甚至不能保证float是二进制浮点格式 一些编译器保证float类型为IEEE-754 32位二进制格式。有些则不然。实际上,在大多数非嵌入式平台上,float实际上是IEEE-754single类型,尽管对于某些编译器以更广泛的格式计算表达式的常见警告适用 有一个工作组讨论为IEEE-75

stdint.h
(C99)和
cstdint
(C++0x)头中,除其他外,还有类型
int32\t


是否有类似的固定大小浮点类型?类似于 FualAT32,

> P>这一点目前在C或C++标准中都没有。事实上,甚至不能保证
float
是二进制浮点格式

一些编译器保证
float
类型为IEEE-754 32位二进制格式。有些则不然。实际上,在大多数非嵌入式平台上,
float
实际上是IEEE-754
single
类型,尽管对于某些编译器以更广泛的格式计算表达式的常见警告适用


有一个工作组讨论为IEEE-75 2008修订版添加C语言绑定,可以考虑建议添加这样的Type。如果这是添加到C,我预计C++标准将遵循…最终。

如果您想知道您的
浮点值是否为IEEE 32位类型,请检查
std::numeric\u limits::is\u iec559
。它是一个编译时常量,不是一个函数

如果您想更加防弹,还可以检查
std::numeric\u limits::digits
,以确保它们没有偷偷地使用IEEE标准双精度进行
浮点运算。应该是24

对于长双精度
,更重要的是检查
数字
,因为有两种IEEE格式,它们可能是合理的:128位(数字=113)或80位(数字=64)


如果你想使用浮点硬件(如果可用的话),而不是依赖于软件实现,那么让
float32\u t
这样做是不切实际的。如果你认为使用诸如float32\u t和float64\u t这样的typedef由于任何原因都是不切实际的,那么你一定太习惯于你熟悉的操作系统、编译器、,你不能太看你的小巢外

存在本机运行32位IEEE浮点运算的硬件和其他执行64位浮点运算的硬件。有时,这样的系统甚至必须相互通信,在这种情况下,了解每个平台上的double是32位还是64位非常重要。如果32位平台基于另一个平台的64位值进行过多计算,我们可能希望根据时间和速度要求转换到较低的精度


我个人觉得使用浮球和双打很不舒服,除非我知道它们在我的平台上到底有多少位。如果我要通过某些通信渠道将这些信息传输到另一个平台,则更是如此。

目前有人建议在语言中添加以下类型:

decimal32
decimal64
decimal128
有一天可以通过
#include
访问


为什么需要这样的东西?当您有一个带有浮点值的数据结构时,您需要这样的东西,并且您还想知道它的确切大小。@mobrule:如果您只需要知道它的大小,您可以使用
sizeof
操作符。当一个算法要求它是一个已知的特定大小时,这样的类型会很有用。@Stephen Canon-是的,当你想保证它的大小时。假设数据结构的一个实例将适合于64位,并且可以通过值传递给某个外部库。@ StpEncNeNon考虑跨平台的序列化库。如何使用
sizeof
来解决一致编组和反编组浮动类型的问题?无论IEEE-754与否,它仍然无法防止endian可移植性问题。@Pietro:更改语言不会影响硬件兼容性,它只会使某些硬件不符合要求。IEEE FP将如何保证可移植性?@Potatoswatter:它将鼓励硬件供应商提供兼容的解决方案。如果a部分支持标准C而不需要软浮动库,而b部分则不支持,那么这就是a部分的市场优势。@Potatoswatter:(几乎)没有人关心硬件的速度。我们关心软件在硬件上运行的速度。如果软件所运行的硬件符合标准,并且软件不需要根据其运行的平台检测和修补15种不同的特殊情况,那么软件的速度可能会更快。究竟如何通过防止代码在许多特定的体系结构上编译来获得更好的可移植性?要么依赖于IEEE的浮点运算,在这种情况下,您的代码将已经在每个符合IEEE的实现上运行,而没有其他功能;要么不依赖于IEEE,在这种情况下,您的代码将在更广泛的系统上运行。如果C++保证了IEEE遵从性,那么代码就不会神奇地变得更便携,您只需排除它可以运行在那些不兼容的架构上。您的逻辑完全是反向的。OS X(32位和64位Intel)上的长双精度
格式正是以小端顺序存储的IEEE-754双扩展格式。一点也不奇怪。字节0-7保存有效位字段,字节8和9保存指数和符号字段。@Stephen:好消息:v)。这与我发布的数字一致吗?请记住,双扩展(与其他754格式不同)有一个明确的前导有效位,因此
5.0L
的有效位为
a00000000000000
。其无偏指数为+2,双扩展指数偏差为
3fff
,因此5.0L的有偏指数为
4001
。当以小端顺序存储时,实际的字节模式是
00 00 a0 01 40
,如果您将其视为两个小端64位整数,您将完全看到您观察到的。(*)双扩展由Intel在硬件中实现,即。双扩展格式实际上并不像IEEE-754(198)的其他两种基本格式那样固定