C / C ++中的固定宽度浮点数

时间:2009-08-26 00:55:26

标签: c++ c floating-point double

int通常为32位,但在标准中,int不保证具有恒定宽度。因此,如果我们需要32位int,我们会包含stdint.h并使用int32_t

浮子有没有相同的效果?我意识到浮点数有点复杂,因为它们不是以同类方式存储的,即符号,指数,有效数。我只想要一个double保证以64位存储,带有1个符号位,10位指数和52/53位有效位(取决于你是否计算隐藏位)。

6 个答案:

答案 0 :(得分:3)

根据the current C99 draft standard附件F,应该加倍。当然,这是假设您的编译器符合标准的这一部分。

对于C ++,我已经检查了0x草案和1998版标准的草案,但似乎都没有指定任何有关C99标准部分的表示,超出了指定IEEE 754的numeric_limits中的bool / IEC 559用于该平台,就像Josh Kelley提到的那样。

很少有平台不支持IEEE 754 - 它通常不会设计另一种浮点格式,因为IEEE 754定义明确且工作得很好 - 如果支持,那么它是合理的假设double实际上是64位(毕竟,IEEE 754-1985调用格式为双精度,所以它是有意义的。)

关于double不是双精度的关闭机会,建立一个完整性检查,以便用户可以报告它,您可以单独处理该平台。如果平台不支持IEEE 754,那么除非您自己实现,否则您无论如何都不会获得该表示。

答案 1 :(得分:3)

虽然我不知道保证特定大小和格式的类型,但在C ++中确实有一些选项。您可以使用<limits>标头及其std::numeric_limits类模板来查找给定类型的大小,std::numeric_limits::digits告诉您尾数中的位数,以及std::numeric_limits::is_iec559应告诉您该类型是否遵循IEEE格式。 (有关在位级操纵IEEE数字的示例代码,请参阅Google Test的gtest-internal.h中的FloatingPoint类模板。)

答案 2 :(得分:1)

另一个问题是浮点数的表示。这通常基于您运行的硬件(但并非总是如此)。大多数系统都使用IEEE 754浮点标准,但其他系统也有自己的标准(例如VAX计算机)。

维基百科解释IEEE 754 http://en.wikipedia.org/wiki/IEEE_754-2008

答案 3 :(得分:1)

我所知道的浮动/双重没有变化。 Float已经有32位多年了,而double已经是64位。浮点语义相当复杂,但确实存在常量

#include <limits>
如果你不需要std :: numeric_limits中的所有东西,

boost.numeric.bounds是一个更简单的接口

答案 4 :(得分:0)

不幸的是,这也不能保证。你必须检查numeric_limits< T > <limits>

但话说回来,我从来没有听说过双重不是64位的实现。如果你想假装,你可能会侥幸逃脱。

答案 5 :(得分:-4)

这种“固定宽度类型”的一个最大问题是它很容易弄错。您可能不想要32位整数。重点是什么?你想要的是一个整数类型,可以存储至少1>&gt; 31。那是long int。你甚至不需要<stdint.h>

同样,只要底层C ++ float 至少 32位,您的脚本语言就可以实现FP类型。请注意,这仍然不能为您提供精确的行为。我相当肯定C ++不保证-1.0/-3.0==1.0/3.0