科学计算当中会用到不少浮点数的操作,这些浮点数大概是16位,32位,64位,80位乃至是128位。开源项目SoftFloat提供了一个高效的浮点运算实现,可以在没有硬件支持的情况下,高效模拟浮点数的各种操作。
那么,浮点数之间的比较,根本运算这些究竟是怎么实现的呢,可以拿32位浮点数作为例子。
这是32位浮点数加法的实现,起首声明了一个结构体float32_t。- typedef struct { uint32_t v; } float32_t;
复制代码 这提供了32位浮点数的底层位表示,同时还声明了一个union。- union ui32_f32 { uint32_t ui; float32_t f; };
复制代码 一方面保存了浮点数的位表示,另一方面也可以转换为32位无符号整型直接举行比较,这在背面的算法当中会直接涉及。先看看加法。
[code]float32_t f32_add( float32_t a, float32_t b ){ union ui32_f32 uA; uint_fast32_t uiA; union ui32_f32 uB; uint_fast32_t uiB;#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1) float32_t (*magsFuncPtr)( uint_fast32_t, uint_fast32_t );#endif uA.f = a; uiA = uA.ui; uB.f = b; uiB = uB.ui;#if defined INLINE_LEVEL && (1 |