2

我正在编写一些将浮点/双精度转换为定点并返回的函数。有谁知道确定用于浮点数或双精度数的指数部分的位数的最佳方法?我希望使用来自 std::numeric_limits 的东西,但没有运气。

指数部分是由 C++ 标准定义的还是特定于编译器/机器的?或者它可以在运行时变化?

4

4 回答 4

6

如果float在该平台上以 IEC-559(在美国也称为 IEEE 754)进行编码,那么它将始终为 8 位。如果该double平台的 使用 IEC-559(或任何 64 位版本)编码,那么它将始终为 11。如果不是,那么您甚至不能假设它存储了指数。

float虽然标准没有指定应该以什么格式存储浮点数,但在 C++11(和 C++03?)中,您可以double使用numeric_limits<T>::is_iec559(where Tis a floating-point type ):

#include <limits>

cout << "float is IEC-559?  " << numeric_limits<float>::is_iec559 << endl
     << "double is IEC-559? " << numeric_limits<double>::is_iec559 << endl;
于 2012-01-12T15:54:27.967 回答
1

numeric_limits<>::{min_exponent, max_exponent} 缺少什么?(他们只能给出归一化数字的答案,如果这不适合您,请与denormand结合使用digits)。

于 2012-01-12T16:24:56.930 回答
0

阅读IEEE-754float和的指数大小double应分别为 8 位和 11 位。

于 2012-01-12T15:55:16.757 回答
0

浮点数的特性取决于机器架构。它在运行时不变。查看编译器的标头 < cfloat >,它应该包含详细信息。

但是您也可以自己潜入机器:WH Press 等人的 C 语言数字食谱一书。包含一个machar.c在第 20.1 章(少数值算法)中命名的程序,用于检测机器的浮点能力,而不假设标准库头文件中的任何内容。它也可以在线获得。

于 2012-01-12T16:29:23.617 回答