瀏覽單個文章
拿破崙波拿巴
*停權中*
 
拿破崙波拿巴的大頭照
 

加入日期: Dec 2018
文章: 53
引用:
作者大天使加百列
hi
我不懂你糾結在哪
半精度和單精度與倍精度並沒有本質上的不同
找 float2int 或 double2int 的函數來改就可以了
這應該沒什麼難度
以下是半精度的規格
都是 IEEE 754 的規範喔
https://zh.wikipedia.org/wiki/%E5%8...%82%B9%E6%95%B0


如果是單精度或倍精度轉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 我沒辦法塞回去
舊 2019-04-14, 04:18 PM #10
回應時引用此文章
拿破崙波拿巴離線中