为我在标题中提出的问题提供更多背景信息:我正在使用 VS C++,我需要从内存中读取 80 位浮点数并将其格式化为人类可读的形式。我可以在某种程度上为 Intel x64/x86 架构做到这一点,但我正在努力弄清楚如何为 Aarch64 做到这一点。
PS。对于 x64,我可以通过使用此函数将 80 位
long double
转换为 double
来在汇编中完成此操作:
; RCX = points to `long double` to convert from
; RDX = points to `double` to convert to
FLD tbyte ptr [RCX]
FSTP qword ptr [RDX]
ret
然后打印转换后的
double
值。它会失去一些精度,但没关系。
我需要从内存中读取一个 80 位浮点数并将其格式化为人类可读的形式。我可以在某种程度上为 Intel x64/x86 架构做到这一点,但我正在努力弄清楚如何为 Aarch64 做到这一点。
尝试 SoftFloat 库,它有 floatx80_to_float32、floatx80_to_float64 和 floatx80_to_float128。检测本机格式,并采取相应措施。
#include "softfloat.h"
#include <iostream>
typedef struct {
void* (*processFloatx80)(floatx80 fx80);
} FloatProcessor;
void* processFloatx80_to_float64(floatx80 fx80) {
float64_t* result = (float64_t*)malloc(sizeof(float64_t));
if (result != NULL) {
*result = floatx80_to_float64(fx80);
}
return result;
}
void* processFloatx80_to_float32(floatx80 fx80) {
float32_t* result = (float32_t*)malloc(sizeof(float32_t));
if (result != NULL) {
*result = floatx80_to_float32(fx80);
}
return result;
}
void* processFloatx80_to_float128(floatx80 fx80) {
float128_t* result = (float128_t*)malloc(sizeof(float128_t));
if (result != NULL) {
*result = floatx80_to_float128(fx80);
}
return result;
}
int main() {
...
floatx80 fx80;
FloatProcessor processor;
#if defined(__FLOAT128__)
processor.processFloatx80 = processFloatx80_to_float128;
#elif defined(__aarch64__) || defined(__arm__) || defined(__x86_64__)
processor.processFloatx80 = processFloatx80_to_float64;
#else
processor.processFloatx80 = processFloatx80_to_float32;
#endif
...
}