如果是單精度或倍精度轉INT我不需要 float2int 或 double2int 來轉
而且我也不是 要問 float 或 double 我問的是 Half float
這個我自己寫來測試用的
代碼:
#include <stdio.h>
#include <stdint.h>
union __attribute__((__packed__)) XMM_u {
int8_t a8[16];
int16_t a16[8];
int32_t a32[4];
int64_t a64[2];
__int128_t a128;
uint8_t u8[16];
uint16_t u16[8];
uint32_t u32[4];
uint64_t u64[2];
__uint128_t u128;
double fa64[2];
float fa32[4];
};
typedef union XMM_u XMM;
int main() {
XMM tmp;
uint32_t ux = 0x10000000;
tmp.u32[0] = ux;
float f;
f = tmp.fa32[0];
printf("float = %e\n", f);
double df;
df = tmp.fa64[0];
printf("double = %e\n", df);
XMM tmp1;
tmp1.fa32[0] = f;
uint32_t cx;
cx = tmp1.u32[0];
printf("float to HEX = %x\n", cx);
tmp1.fa64[0] = df;
uint64_t cdx;
cdx = tmp1.u64[0];
printf("double to HEX = %llx\n", cdx);
return 0;
}
線上轉換對照
https://gregstoll.com/~gregstoll/floattohex/
https://i.imgur.com/3aqCvby.png
XMM 暫存器裡面 整數的值是 0x10000
float 是 9.18....
Double 是 3.23....
哪裡有一樣
float 是 32-bit
double 是 64-bit
Half float 是 16--bit
我是想寫 F16C 指令集的模擬器,現在遇到一個問題
vcvtps2ph 這個指令
https://www.felixcloutier.com/x86/vcvtps2ph
把 XMM 或 YMM 暫存器 float 轉為 Half float 然後 進行 rounding operation
但是問題來了 要 4捨5入 有條件 無條件 要把 int16_t 轉成 Half float 這個有方法轉,但是要塞回暫存器 不轉成 int16 我沒辦法塞回去
