Tag: ieee 754

为什么frexp()不能产生科学记数法?

科学记数法是表达具有明确数量级的数字的常用方法。 首先是非零数字,然后是小数点,然后是小数部分和指数。 在二进制中,只有一个可能的非零数字。 浮点数学涉及隐含的第一个数字等于1,然后尾数位“跟随小数点”。 那么为什么frexp()将小数点放在隐含位的左边,并返回[ frexp()的数字而不是像科学符号那样的[1,2]? 是否有一些溢出要小心? 实际上,它比IEEE 754 / ISO 60559规定的偏差值减去一个以上。在硬件中,这可能会增加XOR的附加值。 单独,这似乎是一个非常弱的论点,考虑到在许多情况下恢复正常将需要另一个浮点运算。

__STDC_IEC_559__与现代C编译器的状态

C99添加了一个宏__STDC_IEC_559__ ,可用于测试编译器和标准库是否符合ISO / IEC / IEEE 60559(或IEEE 754)标准。 根据这个问题的答案 如何检查 – ieee-754-单精度-32位浮点表示大多数C编译器不设置预处理器宏__STDC_IEC_559__ 。 根据GCC的文档,它没有定义__STDC_IEC_559__ 。 我用GCC 4.9.2和Clang 3.6.0测试了这两个,使用glibc 2.21使用以下代码。 //test.c //#include int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif } 然后 echo $? 这表明使用此代码__STDC_IEC_559__是使用GCC定义的,而不是使用Clang定义的。 然后我做了gcc -E ,它显示了包含文件stdc-predef.h 。 该文件定义__STDC_IEC_559__ 。 /* glibc’s intent is […]

任何浮点密集型代码是否会在任何基于x86的架构中产生精确的结果?

我想知道使用浮点运算的C或C ++中的任何代码是否会在任何基于x86的体系结构中产生精确的结果,无论代码的复杂程度如何。 据我所知,自英特尔8087以来的任何x86架构都使用准备处理IEEE-754浮点数的FPU单元,我看不出为什么结果在不同架构中会有所不同的任何原因。 但是,如果它们不同(即由于不同的编译器或不同的优化级别),是否可以通过配置编译器来产生位精确结果?

假设使用C中的IEEE754浮点表示浮点数是否安全?

浮点是在C中定义的实现。因此没有任何保证。 我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受。 出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的。 虽然我知道平台和架构之间可能存在关于long或wchar_t大小的差异。 但我似乎无法找到任何关于float和double具体信息。 到目前为止,我发现字节顺序可能在大端平台上反转。 虽然有没有浮点支持的平台,其中包含float和double的代码甚至不会链接。 否则平台似乎坚持IEEE754单精度和双精度。 因此可以安全地假设浮点在IEEE754可用时? 编辑:回应评论: 你对“安全”的定义是什么? 安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序)。

融合乘法加法和默认舍入模式

使用GCC 5.3,以下代码包含-O3 -fma float mul_add(float a, float b, float c) { return a*b + c; } 生成以下程序集 vfmadd132ss %xmm1, %xmm2, %xmm0 ret 我注意到GCC已经在GCC 4.8中使用了-O3 。 Clang 3.7与-O3 -mfma产生 vmulss %xmm1, %xmm0, %xmm0 vaddss %xmm2, %xmm0, %xmm0 retq 但是Clang 3.7和-Ofast -mfma产生的代码与GCC相同, -O3 fast为-O3 fast 。 我很惊讶GCC使用-O3因为从这个答案来看 除非允许放宽的浮点模型,否则不允许编译器融合分离的加法和乘法。 这是因为FMA只有一个舍入,而ADD + MUL有两个舍入。 因此,编译器将通过融合违反严格的IEEE浮点行为。 但是,从这个链接说 无论FLT_EVAL_METHOD的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度。 所以现在我感到困惑和担忧。 GCC是否有理由将-FMA与-O3一起使用? 融合是否违反了严格的IEEE浮点行为? […]

代表双打中的整数

双精度数(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数范围的一半,即该字节数的一半? 例如,8字节双精度可以完全精确地保持四字节无符号整数的范围吗? 这将归结为如果一个双字节浮点数可以保持一个字节unsigned int的范围。 一个字节的unsigned int当然是0 – > 255。