Tag: 浮点

C99中是否有固定尺寸的浮动和双重类型?

C99表示整数类型,如uint32_t,int16_t等,其中很容易看到使用的位数。 很高兴知道嵌入式编程。 我没有找到浮点值的任何类似类型。 有标准吗? 如果没有,为什么?

C中的小数位数

我喜欢在C中使用浮点数时更改显示的小数位数。它是否与float.h定义的FLT_DIG值有关? 如果是这样,我怎么能把它从6改为10? 我得到的数字是0.000000而实际值是0.0000003455 。

在有限的16字节字符串上写入IEEE 754-1985 double作为ASCII

这是我原帖的后续内容 。 但为了清楚起见,我会重复一遍: 根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 标准是说文本表示是固定点与浮点。 该标准仅涉及在DICOM数据集本身中如何表示值。 因此,不需要将定点文本表示加载到定点变量中。 所以现在很明显,DICOM标准暗示推荐double (IEEE 754-1985)表示Decimal String类型的Value Representation (最多16位有效数字)。 我的问题是如何使用标准CI / O库将这个二进制表示从内存转换回ASCII到这个有限大小的字符串? 从互联网上的随机来源来看,这是非常重要的,但普遍接受的解决方案是: printf(“%1.16e\n”, d); // Round-trippable double, always with an exponent 要么 printf(“%.17g\n”, d); // Round-trippable double, shortest possible 当然,在我的情况下,两个表达式都是无效的,因为它们可以产生比我有限的最大16个字节更长的输出。 那么, […]

通过C语言中的整数转换进行浮点数比较

我想得到一个确切/准确的答案为什么以下代码打印不同的结果: #include “stdio.h” int main(void) { int a = 9; int b = 10; printf(“%d\n”, (double)a / (double)b == 0.9); /* prints 0 */ printf(“%d\n”, (double)9 / (double)10 == 0.9); /* prints 1 */ return 0; } 我认为这可能是编译器依赖的,我的是gcc(GCC mingw Windows7)4.8.1和gcc(Debian 4.7.2-5)4.7.2。 非常感谢你! UPDATE! 我使用和不使用-std = c99选项生成汇编代码,这应该有助于理解这里发生的事情。 没有-std = c99(这给出结果0/1): .file “ac” .section .rodata.str1.1,”aMS”,@progbits,1 .LC0: .string […]

如何将多个fma操作链接在一起以获得性能?

假设在某些C或C ++代码中,我有一个名为T fma( T a, T b, T c )的函数T fma( T a, T b, T c )它执行1次乘法和1次加法,如此( a * b ) + c ; 我该如何优化多个mul并添加步骤? 例如,我的算法需要用3或4个fma操作实现链接和求和,如何编写这是一种有效的方法,在语法或语义的哪个部分我应该特别注意? 我还想了解关键部分的一些提示:避免更改CPU的舍入模式以避免刷新cpu管道。 但我很确定只是在多次调用fma之间使用+操作不应该改变它,我说“非常肯定”,因为我没有太多的CPU来测试它,我只是关注一些逻辑步骤。 我的算法类似于多个fma调用的总和 fma ( triplet 1 ) + fma ( triplet 2 ) + fma ( triplet 3 )

printf和scanf如何处理浮点精度格式?

请考虑以下代码段: float val1 = 214.20; double val2 = 214.20; printf(“float : %f, %4.6f, %4.2f \n”, val1, val1, val1); printf(“double: %f, %4.6f, %4.2f \n”, val2, val2, val2); 哪个输出: float : 214.199997, 214.199997, 214.20 | <- the correct value I wanted double: 214.200000, 214.200000, 214.20 | 我知道214.20有一个无限的二进制表示。 第一行的前两个元素具有预期值的近似值,但最后一个元素似乎根本没有近似值,这引出了以下问题: scanf , fscanf , printf , fprintf (等)函数如何处理精度格式? 由于没有提供精度, […]

sizeof long double和precision不匹配?

考虑以下C代码: #include int main(int argc, char* argv[]) { const long double ld = 0.12345678901234567890123456789012345L; printf(“%lu %.36Lf\n”, sizeof(ld), ld); return 0; } 在Ubuntu x64 13.04下用gcc 4.8.1编译,它打印: 16 0.123456789012345678901321800735590983 这告诉我一个长双倍权重16字节,但小数似乎只对第20位。 这怎么可能? 16个字节对应四元组,四元组给出33到36个小数。

从给定的符号,尾数和指数构造浮点(double)的宏或函数?

是否有任何宏或函数从给定的符号,尾数和指数(所有二进制或十进制)构造一个float(double),它返回一个有效的float(double)数字,如果输入指定的数字不能表示,则返回NaN漂浮(双)?

IEEE Std 754浮点:让t:= a – b,标准保证a == b + t吗?

假设t , a , b都是双(IEEE Std 754)变量,并且a , b两个值都不是NaN (但可以是Inf )。 在t = a – b ,我是否必须有a == b + t ?

C中的负零

你好我正在学习Objective C,我正在做经典的计算器示例。 问题是当我将零乘以任何负数时,我得到负零,并且我将结果放入(双)类型! 为了看看发生了什么,我玩了调试器,这就是我得到的: (gdb)print -2 * 0 $ 1 = 0 (gdb)print(double)-2 * 0 $ 2 = -0 在第二种情况下,当我将它转换为双重类型时,它变成负零! 如何在我的应用程序中修复它? 我需要和双打一起工作。 如何修复结果,以便在结果为零时得到零? 提前致谢。