在 stdint.h
(C99)、boost/cstdint.hpp 和 cstdint
(C++0x)头文件中,除其他类型外,还有一个名为 int32_t
的类型。
是否存在类似的固定大小的浮点类型?例如 float32_t
?
在 stdint.h
(C99)、boost/cstdint.hpp 和 cstdint
(C++0x)头文件中,除其他类型外,还有一个名为 int32_t
的类型。
是否存在类似的固定大小的浮点类型?例如 float32_t
?
目前在C或C++标准中并不存在这样的东西。事实上,甚至不能保证float
一定是二进制浮点数格式。
有些编译器保证float
类型将是IEEE-754 32位二进制格式,而有些则不保证。实际上,在大多数非嵌入式平台上,float
实际上是IEEE-754的single
类型,尽管通常会有关于某些编译器在更广泛的格式中计算表达式的注意事项。
有一个工作组正在讨论为IEEE-754 2008修订版添加C语言绑定,该工作组可以考虑建议添加此类typedef。如果这被添加到C中,我预计C++标准最终也会跟进。
如果您想知道您的float
是否为IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559
。这是一个编译时常量,而不是函数。
如果您想更加可靠,还应该检查std::numeric_limits<float>::digits
,以确保它们没有偷偷使用IEEE标准双精度作为float
。 它应该是24。
当涉及到long double
时,检查digits
更加重要,因为有几种IEEE格式可以合理地使用:128位(digits = 113)或80位(digits = 64)。
由于通常希望使用浮点硬件(如果有的话),而不是回退到软件实现,因此将float32_t
作为此类并不实际。
5.0L
的有效数字为a000000000000000
。它的无偏指数为+2,双扩展指数偏差为3fff
,因此5.0L的偏置指数为4001
。以小端顺序存储时的实际字节模式为00 00 00 00 00 00 00 a0 01 40
,如果将其视为两个小端顺序的64位整数,则可以看到您观察到的完全相同的结果。 - Stephen Canon如果你认为像float32_t和float64_t这样的类型定义在任何情况下都不实用,那么你可能已经太习惯于自己熟悉的操作系统和编译器,不能从自己的小窝里走出来看看外面的世界。
存在一些硬件能够本地运行32位或64位IEEE浮点数操作。有时这些系统甚至需要相互通信,在这种情况下,非常重要的是要知道每个平台上double类型是32位还是64位。如果32位平台基于其他平台的64位值进行过多计算,我们可能需要根据时间和速度要求将其转换为较低精度。
个人感觉使用浮点数和双精度浮点数时,除非我确切地知道它们在我的平台上有多少位,否则会感到不安。如果我要通过某种通信渠道将它们传输到另一个平台,那么这种不安更加明显。
C++23引入了符合IEEE 754标准的定点浮点数。
以下是实例化64位浮点数的方法:
#include <stdfloat>
int main()
{
std::float64_t f = 0.1f64;
}
实现方案可以在这里找到。
std::float64_t
并不保证存在。只有在目标架构支持IEEE浮点数的情况下才需要它 - 例如,为IBM大型机编译的编译器可能决定支持传统的IBM浮点数格式。 - undefined目前有一个提议将以下类型添加到语言中:
decimal32
decimal64
decimal128
有一天可能会通过 #include <decimal>
访问。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24
,这样可以更轻松地读取带有24位采样的wav文件! - tjwrona1992
sizeof
运算符。像这样的类型在算法要求具有已知特定大小时很有用。 - Stephen Canonsizeof
来解决浮点类型数据的一致编组与解组问题? - Kyle Strand