Tag: 浮点

C函数将float转换为byte数组

我正在尝试创建一个接受float变量并将其转换为字节数组的函数。 我发现了一段可行的代码,但如果可能的话,我希望在函数中重用它。 我也在使用Arduino环境,但我知道它接受大多数C语言。 目前有效: float_variable = 1.11; byte bytes_array[4]; *((float *)bytes_array) = float_variable; 我可以在这里更改以使此function有效吗? float float_test = 1.11; byte bytes[4]; // Calling the function float2Bytes(&bytes,float_test); // Function void float2Bytes(byte* bytes_temp[4],float float_variable){ *(float*)bytes_temp = float_variable; } 我对指针等不太熟悉,但我读过(浮动 )是使用铸造还是什么? 任何帮助将不胜感激! 干杯 *编辑:已解决 这是我的最终function在Arduino中适用于任何发现此function的人。 在下面的答案中有更有效的解决方案,但我认为这是可以理解的。 function:将输入浮点变量转换为字节数组 void float2Bytes(float val,byte* bytes_array){ // Create union of shared memory space union […]

浮点运算中的flush-to-zero行为

虽然,据我所知,IEEE 754没有提及关于刷新到零模式来更快地处理非规范化数字 ,但是一些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib .html )。 在本技术文档的特定情况下,非规范化数字的标准处理是默认值,并且必须明确激活flush-to-zero。 在默认模式下,非规范化数字也在软件中处理,这比较慢。 我在嵌入式C的静态分析器上工作,试图预测在运行时可能发生的值的正确(如果有时是不精确的)范围。 它的目的是正确的,因为它可用于排除在运行时出现错误的可能性(例如对于关键的嵌入式代码)。 这需要在分析期间捕获所有可能的行为,因此在浮点计算期间产生所有可能的值。 在这方面,我的问题是双重的: 在嵌入式架构中,是否存在仅提供从零到零的架构 ? 他们可能没有权利将自己宣传为“IEEE 754”,但可以提供足够接近IEEE 754风格的浮点运算。 对于在嵌入式环境中提供两者的体系结构, 可能不会被系统激活为零 ,以使反应时间更可预测(这些嵌入式系统的常见约束)? 在我用于浮点值的区间运算中处理flush-to-zero非常简单,如果我知道我必须这样做,我的问题是我是否必须这样做。

什么时候发生下溢?

我遇到计算1.77e-308/10触发下溢exception的情况,但计算1.777e-308/10则没有。 这很奇怪,因为: 当浮点运算的真实结果的幅度(​​即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢 换句话说,如果我们计算x/y和y都是double x/y ,那么如果0 < |x/y| < 2.2251e-308则会发生下溢0 < |x/y| < 2.2251e-308 0 < |x/y| < 2.2251e-308 (最小的正标准化double 2.2251e-308为2.2251e-308 )。 因此,理论上, 1.77e-308/10和1.777e-308/10都应触发下溢exception。 该理论与我在下面的C程序中测试的内容相矛盾。 #include #include #include int main(){ double x,y; // x = 1.77e-308 => underflow // x = 1.777e-308 gives ==> no underflow x=1.77e-308; feclearexcept(FE_ALL_EXCEPT); y=x/10.0; if (fetestexcept(FE_UNDERFLOW)) { puts(“Underflow\n”); } else […]

除以零 – c编程

我对下一个代码有疑问: int main { double x = 0; double y = 0/x; if(y==1) {…..} …. …. return 0; } 当我在我的计算机上运行代码时,我没有得到运行时错误,我看到y = -nan(0x8000000000000) 。 为什么不将运行时错误除以零? 另外,当我将第一行更改为int x = 0; 现在有一个运行时错误。 有什么不同?

从双精度参数开始的80位扩展精度计算的属性

以下是插值函数的两种实现。 参数u1始终在0.和1.之间。 #include double interpol_64(double u1, double u2, double u3) { return u2 * (1.0 – u1) + u1 * u3; } double interpol_80(double u1, double u2, double u3) { return u2 * (1.0 – (long double)u1) + u1 * (long double)u3; } int main() { double y64,y80,u1,u2,u3; u1 = 0.025; u2 = 0.195; u3 […]

为什么C浮点类型会在输出时修改125.1到125.099998的实际输入?

我写了以下程序: #include int main(void) { float f; printf(“\nInput a floating-point no.: “); scanf(“%f”,&f); printf(“\nOutput: %f\n”,f); return 0; } 我在Ubuntu上并使用GCC编译上述程序。 这是我想要查询的示例运行和输出: Input a floating-point no.: 125.1 Output: 125.099998 为什么精度会发生变化?

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

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

设置精度和剪辑尾随零但从不打印指数

我需要: 设置精度,使浮点数舍入到百分位数(0.111打印为0.11) 剪辑尾随零(1.0打印为1) 永远不要打印指数(1000.1打印为1000.1) printf( “%.2f\n”, input ); // handles 1 and 3 but not 2 printf( “%.2g\n”, input ); // handles 1 and 2 but not 3 cout << setprecision( 2 ) << input << endl; // handles 1 and 2 but not 3 是否有printf或cout选项可以让我处理所有这些?

与浮点数混淆

int main() { float x=3.4e2; printf(“%f”,x); return 0; } 输出: 340.000000 //没关系 但如果写x=3.1234e2则输出为312.339996 ,如果x=3.12345678e2则输出为312.345673 。 为什么输出会像这样? 我想如果我写x=3.1234e2 ,输出应该是312.340000 ,但实际输出是312.339996使用GCC编译器。

C和C ++中float和double的大小是多少?

我正在寻找是否有任何类似于uint32_t标准类型,它总是会映射到32位无符号整数类型但我找不到任何类型。 float的大小在所有平台上总是4个字节吗? double大小总是8? 这两个标准是否有任何关于此事的说法? 我想确保我的大小在所有平台(x86和x64)上总是相同的,所以我使用的是标准的int类型,但是我找不到任何类似的float和double typedef。