在stdint.h(C99)、boost/cstdint.hpp和cstdint(C++0x)头文件中,除其他外,还有int32_t类型。是否有类似的固定大小浮点类型?比如float32_t?
stdint.h
cstdint
int32_t
float32_t
wa7juj8i1#
目前,在C或C标准中还没有这样的东西。事实上,根本不能保证float是二进制浮点格式。一些编译器保证float类型将是IEEE-754 32位二进制格式。有些人则不然。实际上,float实际上是 * 大多数 * 非嵌入式平台上的IEEE-754 single类型,尽管一些编译器以更广泛的格式计算表达式的常见警告适用。有一个工作组正在讨论为IEEE-754的2008修订版添加C语言绑定,该工作组可以考虑建议添加这样的typedef。如果这被添加到C中,我希望C标准也会效仿...最终会的
float
single
ezykj2lf2#
如果您想知道float是否是IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559。它是一个编译时常量,而不是一个函数。如果您想更安全,还可以检查std::numeric_limits<float>::digits,以确保它们没有偷偷地使用float的IEEE标准双精度。应该是24。当涉及到long double时,检查digits更重要,因为有几种IEEE格式可能是合理的:128位(数字= 113)或80位(数字= 64)。使用这样的float32_t是不实际的,因为您通常希望使用浮点硬件(如果可用),而不是依靠软件实现。
std::numeric_limits<float>::is_iec559
std::numeric_limits<float>::digits
long double
digits
ua4mk5z43#
如果你认为拥有float32_t和float64_t这样的类型定义是不切实际的,那么你一定是太习惯于你熟悉的操作系统,编译器,以至于你无法跳出你的小巢。存在本机运行32位IEEE浮点运算的硬件和执行64位运算的其他硬件。有时候,这样的系统甚至必须互相通信,在这种情况下,知道每个平台上的double是32位还是64位是非常重要的。如果32位平台要基于另一个平台的64位值进行过多的计算,我们可能需要根据时序和速度要求转换为较低的精度。我个人觉得使用浮点数和双精度浮点数很不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过一些通信渠道将这些传输到另一个平台,情况就更是如此。
j2cgzkjk4#
目前有一个建议是将以下类型添加到语言中:
decimal32 decimal64 decimal128
其有一天可以通过#include <decimal>访问。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
#include <decimal>
ecr0jaav5#
符合IEEE 754的固定精度浮点数在C++23中引入。
下面是如何示例化一个64位float:
#include <stdfloat> int main() { std::float64_t f = 0.1f64; }
实施方案可以在here中找到
5条答案
按热度按时间wa7juj8i1#
目前,在C或C标准中还没有这样的东西。事实上,根本不能保证
float
是二进制浮点格式。一些编译器保证
float
类型将是IEEE-754 32位二进制格式。有些人则不然。实际上,float
实际上是 * 大多数 * 非嵌入式平台上的IEEE-754single
类型,尽管一些编译器以更广泛的格式计算表达式的常见警告适用。有一个工作组正在讨论为IEEE-754的2008修订版添加C语言绑定,该工作组可以考虑建议添加这样的typedef。如果这被添加到C中,我希望C标准也会效仿...最终会的
ezykj2lf2#
如果您想知道
float
是否是IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559
。它是一个编译时常量,而不是一个函数。如果您想更安全,还可以检查
std::numeric_limits<float>::digits
,以确保它们没有偷偷地使用float
的IEEE标准双精度。应该是24。当涉及到
long double
时,检查digits
更重要,因为有几种IEEE格式可能是合理的:128位(数字= 113)或80位(数字= 64)。使用这样的
float32_t
是不实际的,因为您通常希望使用浮点硬件(如果可用),而不是依靠软件实现。ua4mk5z43#
如果你认为拥有float32_t和float64_t这样的类型定义是不切实际的,那么你一定是太习惯于你熟悉的操作系统,编译器,以至于你无法跳出你的小巢。
存在本机运行32位IEEE浮点运算的硬件和执行64位运算的其他硬件。有时候,这样的系统甚至必须互相通信,在这种情况下,知道每个平台上的double是32位还是64位是非常重要的。如果32位平台要基于另一个平台的64位值进行过多的计算,我们可能需要根据时序和速度要求转换为较低的精度。
我个人觉得使用浮点数和双精度浮点数很不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过一些通信渠道将这些传输到另一个平台,情况就更是如此。
j2cgzkjk4#
目前有一个建议是将以下类型添加到语言中:
其有一天可以通过
#include <decimal>
访问。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
ecr0jaav5#
符合IEEE 754的固定精度浮点数在C++23中引入。
下面是如何示例化一个64位float:
实施方案可以在here中找到