固定大小的浮点类型

Fixed-size floating point types

提问人:Pietro 提问时间:3/27/2010 最后编辑:WhymarrhPietro 更新时间:11/22/2023 访问量:69866

问:

在 (C99)、boost/cstdint.hpp 和 (C++0x) 标头中,类型为 .stdint.hcstdintint32_t

是否有类似的固定大小浮点类型?像这样的东西 ?float32_t

C++ C 提升 浮点

评论

49赞 mob 3/27/2010
当你有一个具有浮点值的数据结构时,你需要这样的东西,并且你还想知道它的大小到底是多少。
2赞 Pietro 3/27/2010
Bears:我需要知道的是标准C++或Boost是否遵循IEEE 754的浮点数。我不想要依赖于架构/操作系统/编译器的大小。
5赞 Stephen Canon 3/27/2010
@mobrule:如果你只需要知道尺寸是多少,你就使用运算符。当算法要求它是已知的特定大小时,这样的类型将很有用。sizeof
6赞 mob 3/27/2010
@Stephen佳能 - 是的,当您想保证尺寸时。比如说,你的数据结构的一个实例将适合 64 位,并且可以按值传递到某个外部库。
9赞 Kyle Strand 6/23/2015
@StephenCanon 考虑跨平台序列化库。如何使用来解决浮动类型一致编组和解组的问题?sizeof

答:

51赞 Stephen Canon 3/27/2010 #1

目前在C或C++标准中不存在这样的东西。事实上,甚至不能保证会是二进制浮点格式。float

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

有一个工作组正在讨论为 IEEE-754 的 2008 年修订版添加 C 语言绑定,该工作组可以考虑建议添加这样的 typedef。如果将其添加到 C 中,我希望 C++ 标准也会效仿......最终。

评论

3赞 Mark B 3/27/2010
无论是否采用 IEEE-754,它仍然无法防止字节序可移植性问题。
1赞 Potatoswatter 3/27/2010
@Pietro:更改语言不会影响硬件兼容性,只会阻止某些硬件的合规性。IEEE FP 保证如何帮助可移植性?
2赞 Stephen Canon 3/27/2010
@Potatoswatter:它将鼓励硬件供应商提供合规的解决方案。如果 a 部分支持标准 C 而不需要软浮点库 hack,而 b 部分不支持,那么这就是 a 部分的市场优势。
2赞 Stephen Canon 3/27/2010
@Potatoswatter:(几乎)没有人关心硬件的速度。我们关心软件在硬件上运行的速度。如果运行软件的硬件符合标准,并且软件不需要检测和修补 15 种不同的特殊情况,具体取决于运行它的平台,则软件可以更快。
8赞 jalf 3/27/2010
你到底如何通过防止你的代码在许多利基架构上编译来获得更好的可移植性?要么你依赖于 IEEE 的浮点数,在这种情况下,你的代码已经在每个符合 IEEE 的实现上运行,没有其他任何内容,要么你不依赖,在这种情况下,你的代码将在更广泛的系统上运行。如果C++保证IEEE合规性,你的代码就不会神奇地变得更可移植,你只需要排除它可能在那些不合规的架构上运行。你的逻辑完全是倒退的。
39赞 Potatoswatter 3/27/2010 #2

如果您想知道 your 是否为 IEEE 32 位类型,请选中 。它是一个编译时常量,而不是一个函数。floatstd::numeric_limits<float>::is_iec559

如果您想更加防弹,还要检查以确保他们没有偷偷地使用 IEEE 标准的双精度。它应该是 24。std::numeric_limits<float>::digitsfloat

当涉及到 时,检查更为重要,因为有几种 IEEE 格式可能是合理的:128 位(数字 = 113)或 80 位(数字 = 64)。long doubledigits

这样做是不切实际的,因为您通常希望使用浮点硬件(如果可用),而不是依靠软件实现。float32_t

评论

0赞 Stephen Canon 3/27/2010
OS X(32 位和 64 位 Intel)上的格式完全是以 little-endian 顺序存储的 IEEE-754 双扩展格式。一点也不时髦。字节 0-7 保存有效字段,字节 8 和 9 保存指数和符号字段。long double
0赞 Potatoswatter 3/27/2010
@Stephen:这是个好消息:v)。这与我发布的数字一致吗?
1赞 Stephen Canon 3/27/2010
请记住,double extensiond(与其他 754 格式不同)具有显式前导有效位,因此具有 的有效位。它的无偏指数为 +2,双扩展指数偏置为 ,因此 5.0L 的偏置指数为 。以 little-endian 顺序存储时的实际字节模式是 ,如果您将其视为两个 little-endian 64 位整数,您将看到您观察到的确切内容。5.0La0000000000000003fff400100 00 00 00 00 00 00 a0 01 40
0赞 Stephen Canon 3/27/2010
(*) 英特尔在硬件中实现的双重扩展,即。双扩展格式实际上并没有像 IEEE-754 (1985) 的其他两种基本格式那样固定下来。
0赞 Potatoswatter 3/27/2010
@Stephen:我很确定在 little-endian 中是 如果不出意外,最低有效字节排在第一位。我确实希望序列出现在数字中的某个地方(如果它们只执行旋转),但我认为您没有解释原因并且处于完全不同的一半。400101 40 00 00 ...a0 01 40a001 40
25赞 EmbeddedCoder 3/21/2014 #3

如果你认为拥有 float32_t 和 float64_t 等 typedef 出于任何原因都是不切实际的,那么你一定太习惯了你熟悉的操作系统、编译器,以至于你无法超越你的小巢穴。

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

我个人对使用浮点数和双打感到不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过某些通信渠道将这些传输到另一个平台,则更是如此。

评论

0赞 Pietro 4/1/2014
“我个人觉得使用浮点数和双打感到不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过某些通信渠道将这些传输到另一个平台,那就更是如此了。 - 你的意思是你使用文本文件格式?有了这些,文件大小就有缺点:32 浮点数需要 4 个字节;这些文本形式的数字只能代表一个四位数......
2赞 Trevor Hickey 1/14/2016 #4

目前有人提议将以下类型添加到语言中:

decimal32
decimal64
decimal128

也许有一天可以通过 .#include <decimal>

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

评论

5赞 Mike DeSimone 1/29/2016
当然,十进制类型不是 IEEE 754 浮点类型。
0赞 tjwrona1992 11/11/2020
等!我们还需要使读取带有 24 位样本的 wav 文件之类的事情变得更容易!decimal24
11赞 NullPointerException 5/8/2023 #5

C++23 中引入了符合 IEEE 754 的固定精度浮点数。

以下是实例化 64 位浮点数的方法:

#include <stdfloat>
int main()
{
    std::float64_t f = 0.1f64;
}

实施建议可以在这里找到

评论

1赞 NullPointerException 5/9/2023
此功能是在 GCC 13 中引入的
1赞 James Kanze 11/22/2023
可能值得指出的是,这并不能保证存在。仅当目标体系结构支持 IEEE 浮点时才需要它 - IBM 大型机的编译器可以决定支持传统的 IBM 浮点格式。std::float64_t