我有一个程序,它运行在两个处理器上,其中一个没有浮点支持.所以,我需要在该处理器中使用固定点执行浮点计算.为此,我将使用浮点仿真库.
我需要首先在处理器上提取浮点数的符号,尾数和指数,它们支持浮点数.所以,我的问题是如何获得单个精度浮点数的符号,尾数和指数.
按照这个图的格式,
这就是我到目前为止所做的,但除了符号,尾数和指数都不正确.我想,我错过了一些东西.
void getSME( int& s, int& m, int& e, float number )
{
unsigned int* ptr = (unsigned int*)&number;
s = *ptr >> 31;
e = *ptr & 0x7f800000;
e >>= 23;
m = *ptr & 0x007fffff;
}
Run Code Online (Sandbox Code Playgroud) 在我的C++程序中,我需要从外部字节序列中提取64位浮点数.有没有办法确保在编译时双打是64位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读本文并实际寻找确保以IEEE 754格式存储的方法,请查看下面的Adam Rosenfield的答案.
IEEE 754浮点格式是否跨平台定义良好?在位格式和字节顺序方面?
我愿意在我的代码中添加以下内容(初始版本):
static_assert(std::numeric_limits<float>::is_iec559, "Only support IEC 559 (IEEE 754) float");
static_assert(sizeof(float) * CHAR_BIT == 32, "Only support float => Single Precision IEC 559 (IEEE 754)");
static_assert(std::numeric_limits<double>::is_iec559, "Only support IEC 559 (IEEE 754) double");
static_assert(sizeof(float) * CHAR_BIT == 64, "Only support double => Double Precision IEC 559 (IEEE 754)");
static_assert(std::numeric_limits<long double>::is_iec559, "Only support IEC 559 (IEEE 754) long double");
static_assert(sizeof(float) * CHAR_BIT == 128, "Only support long double => Exteneded Precision IEC 559 (IEEE 754)");
// More asserts if required. …Run Code Online (Sandbox Code Playgroud) 我已经创建了自己的固定类型整数类型,并且该库适用于许多编译器和平台,唯一需要解决的问题是从内置浮点类型转换为我的类型.
该浮点类型可有小尾数但随着指数沿着它可能有很大的价值,如果我选择投float,double或者long double说long long或unsigned long long可能发生截断.
如果编译器使用IEEE-754规范,那么提取尾数和指数很容易,但如果编译器使用其他格式则会怎样.
所以,我的问题是:是否有任何通用算法允许我仅使用语言功能从浮点数中提取完整值?
谢谢