Tag: 浮点

通过0.0时减去浮点数时出错

以下程序: #include int main() { double val = 1.0; int i; for (i = 0; i < 10; i++) { val -= 0.2; printf("%g %s\n", val, (val == 0.0 ? "zero" : "non-zero")); } return 0; } 生成此输出: 0.8 non-zero 0.6 non-zero 0.4 non-zero 0.2 non-zero 5.55112e-17 non-zero -0.2 non-zero -0.4 non-zero -0.6 non-zero -0.8 […]

随机浮点数

我编写了这个函数来获得0 … 1之间的伪随机浮点数: float randomFloat() { float r = (float)rand()/(float)RAND_MAX; return r; } 但是,它总是返回0.563585。 无论我运行控制台应用程序多少次,都是相同的数字。 编辑: 如果需要,这是我的整个申请: #include #include float randomFloat() { float r = (float)rand() / (float)RAND_MAX; return r; } int main(int argc, char *argv[]) { float x[] = { 0.72, 0.91, 0.46, 0.03, 0.12, 0.96, 0.79, 0.46, 0.66, 0.72, 0.35, -0.16, -0.04, -0.11, […]

从i386移动到x86_64时的浮点精度

我有一个为Linux x86 32位开发的应用程序。 根据结果​​,有许多浮点运算和大量测试。 现在我们将它移植到x86_64,但测试结果在这个架构中是不同的。 我们不希望为每个体系结构保留一组单独的结果。 根据GCC简介 – 对于GNU编译器gcc和g ++ ,问题是X86_64中的GCC假设fpmath = sse而x86假定fpmath = 387 。 387 FPU对所有操作使用80位内部精度 ,仅将结果转换为给定的浮点类型(float,double或long double),而SSE使用操作数的类型来确定其内部精度。 在编译我自己的代码并且我的所有操作都正常工作时,我可以强制-mfpmath = 387 ,但每当我调用一些库函数(sin,cos,atan2等)时,结果再次出错。 我认为这是因为libm是在没有fpmath覆盖的情况下编译的。 我尝试使用387仿真自己构建libm(glibc),但它导致了很多崩溃(不知道我做错了什么)。 有没有办法强制进程中的所有代码在x86_64中使用387仿真? 或者也许某些库在两种体系结构上都返回与libm相同的值? 有什么建议? 关于“你需要80位精度”的问题,我不得不说这不是个别操作的问题。 在这个简单的情况下,差异非常小,没有区别。 但是,当复合很多操作时,错误会传播,并且最终结果的差异不再那么小,并且会产生影响。 所以我想我需要80位精度。

C printf使用%d和%f

我正在研究这个程序,我注意到使用%f表示double,%d表示float,这给了我一些完全不同的东西。 谁知道为什么会这样? int main () { float a = 1F; double b = 1; printf(“float =%d\ndouble= %f”, a, b); } 这是输出 float = -1610612736 double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000

有没有可以使用libc中的函数fma的情况?

我遇到这个页面 ,发现有一个奇怪的浮动乘法加法函数fmaf和fmaf 。 它说结果是这样的: (x * y) + z #fma(x,y,z) 并且值是无限精度并且对结果格式进行一次舍入 。 然而,AFAICT我以前从未见过这样的三元手术。 所以我想知道这个function的cumstom用法是什么。

如果可以用IEEE 754中的二进制格式表示硬编码是否精确浮动?

例如,0,0.5,0.15625,1,2,3 ……是从IEEE 754转换而来的值。它们的硬编码版本是否精确? 例如: 是 float a=0; if(a==0){ return true; } 总是回归真实? 其他例子: float a=0.5; float b=0.25; float c=0.125; a * b总是等于0.125而a * b == c总是如此? 还有一个例子: int a=123; float b=0.5; a * b总是61.5? 或者一般来说,整数乘以IEEE 754二进制浮点精确? 或者更一般的问题:如果值是硬编码,并且值和结果都可以用IEEE 754中的二进制格式表示(例如:0.5 – 0.125),那么值是否准确?

64位浮点移植问题

我正在将我的应用程序从32位移植到64位。 目前,代码在两种架构下编译,但结果不同。 由于各种原因,我使用浮动而不是双打。 我假设在一台机器上有一些从浮动到双重的隐式上转换而不是另一台机器。 有没有办法控制这个,或者我应该寻找的具体问题? 编辑添加: 32位平台 gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33) Dual-Core AMD Opteron(tm) Processor 2218 HE 64位平台 gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3 Intel(R) Xeon(R) CPU 应用-mfpmath = 387有点帮助,在算法的1次迭代之后,值是相同的,但除此之外,它们再次失去同步。 我还要补充一点,我的担心并不是结果不一样,而是移植到64位平台已经发现了32位依赖关系,我不知道。

我可以比较一个浮点数并将其添加到C中的整数吗?

我可以将浮点数与整数进行比较吗? 浮点数会与代码中的整数相比吗? float f; // f has a saved predetermined floating-point value to it if (f >=100){__asm__reset…etc} 我还能…… float f; int x = 100; x+=f; 我必须使用从姿态参考系统接收的浮点值f来调整控制PWM信号以校正姿态的位置值x 。

在C中表示浮动

我试图用这个代码理解C中的浮点表示( float和int在我的机器上都是4个字节): int x = 3; float y = *(float*) &x; printf(“%d %e \n”, x, y); 我们知道x的二进制表示如下 00000000000000000000000000000011 因此,我希望y表示如下 符号位(左起第一位)= 0 指数(左起第2-9位)= 0 尾数(位10-32): 1 + 2^(-22)+2^(-23) 导致y = (-1)^0 * 2^(0-127) * (1+2^(-22) + 2^(-23)) = 5.87747E-39 然而,我的程序打印出来 3 4.203895e-45 也就是说,y的值为4.203895e-45而不是我预期的5.87747E-39 。 为什么会这样呢? 我究竟做错了什么? PS我也直接从gdb打印了这些值,因此printf命令没有问题。

使用c – printf将ieee 754 float转换为hex

理想情况下,以下代码将采用IEEE 754表示forms的浮点数并将其转换为hex void convert() //gets the float input from user and turns it into hexadecimal { float f; printf(“Enter float: “); scanf(“%f”, &f); printf(“hex is %x”, f); } 我不太确定会出现什么问题。 它将数字转换为hex数,但却是一个非常错误的数字。 123.1443 gives 40000000 43.3 gives 60000000 8 gives 0 所以它正在做某事,我只是不太确定是什么。 帮助将不胜感激