Tag: 浮点

Do-s和DO-for浮点运算?

对于浮点运算(IEEE754,如果存在混淆)有什么好的做法和不做什么,以确保良好的数值稳定性和结果的高精度? 我知道有些人不喜欢减去相似幅度的数量,但我很好奇其他有什么好的规则。

将float转换为char *

如何在C语言中将float值转换为char* ?

arm皮质a9交叉编译奇怪的浮点行为

我试图将一个更大的应用程序从x86移植到arm cortex a9,但是当交叉编译应用程序时,我得到了像modf这样的浮点函数的奇怪分段错误,其他libc ++函数似乎只是处理浮动错误,但不会崩溃(见下文)。 所以我尝试了这个小测试程序,它也可以触发错误。 测试程序的输出(见下文)应该certificate我的问题。 #include int main(int argc, char *argv[]) { double x = 80; double y = 0; std::cout << x << "\t" << y << std::endl; return 0; } 编译在arm cortex a9: @tegra$ g++ -Wall test.cpp -o test_nativ @tegra$ ./test_nativ 80 0 交叉编译 @x86$ arm-cortex_a9-linux-gnueabi-g++ test.cpp -o test_cc @tegra$ ./test_cc 0 […]

float_t有什么意义,应该何时使用?

我正在与一个使用旧版本GCC(确切地说是3.2.3)的客户合作,但是想要升级,并且作为升级到更新版本的绊脚石的一个原因是float_t类型的大小不同这当然是正确的: 在GCC 3.2.3上 sizeof(float_t) = 12 sizeof(float) = 4 sizeof(double_t) = 12 sizeof(double) = 8 关于GCC 4.1.2 sizeof(float_t) = 4 sizeof(float) = 4 sizeof(double_t) = 8 sizeof(double) = 8 但这种差异的原因是什么? 为什么尺寸变小,什么时候应该也不应该使用float_t或double_t ?

如何用C双重表示无穷大?

我从计算机系统:程序员的观点中了解到,IEEE标准要求使用以下64位二进制格式表示双精度浮点数: s:1位用于标志 exp:指数为11位 压裂:分数为52位 +无穷大表示为具有以下模式的特殊值: s = 0 所有exp位都是1 所有分数位均为0 我认为double的完整64位应按以下顺序排列: (一个或多个)(EXP)(FRAC) 所以我编写以下C代码来validation它: //Check the infinity double x1 = (double)0x7ff0000000000000; // This should be the +infinity double x2 = (double)0x7ff0000000000001; // Note the extra ending 1, x2 should be NaN printf(“\nx1 = %f, x2 = %f sizeof(double) = %d”, x1,x2, sizeof(x2)); if (x1 == x2) […]

如何填充printf以考虑负号和可变长度数?

我试图在日志文件中输出一些数字,我想通过printf函数填充一大堆浮点数来产生: 058.0 020.0 038.0 -050.0 800.0 150.0 100.0 目前我这样做: printf(“% 03.1f\n”, myVar); …其中myVar是一个浮点数。 该语句的输出如下所示: 58.0 20.0 38.0 -50.0 800.0 150.0 100.0 根据我的阅读,我希望我的代码能够生成我在本文顶部提到的输出,但显然有些不对劲。 你一次只能使用一面旗帜吗? ..或者还有什么东西在这里发生?

为什么返回浮点值会改变其值?

以下代码在Red Hat 5.4 32位上引发了assert ,但在Red Hat 5.4 64位(或CentOS)上运行。 在32位上,我必须将millis2seconds的返回值放在一个变量中,否则会引发assert ,表明函数返回的double值与传递给它的值不同。 如果你评论“#define BUG”行,它就可以了。 感谢@R,将-msse2 -mfpmath选项传递给编译器,使得millis2seconds函数的两个变量都能正常工作。 /* * TestDouble.cpp */ #include #include #include static double millis2seconds(int millis) { #define BUG #ifdef BUG // following is not working on 32 bits architectures for any values of millis // on 64 bits architecture, it works return (double)(millis) / 1000.0; […]

我在哪里可以找到世界上最快的实施方案?

我正在寻找IA32上极其快速的atof()实现,针对US-en语言环境,ASCII和非科学表示法进行了优化。 WindowsmultithreadingCRT在这里惨败,因为它检查每次调用isdigit()时的语言环境变化。 我们目前最好的是源自perl + tcl的最佳实现,并且优于msvcrt.dll的atof一个数量级。 我想做得更好,但我没有想法。 与BCD相关的x86指令看起来很有希望,但我无法让它超越perl / tcl C代码。 任何SO的人都可以找到最好的链接吗? 也欢迎基于非x86组件的解决方案。 根据初步答案澄清: 对于该应用,~2 ulp的不准确性是好的。 要转换的数字将通过网络小批量地到达ascii消息,我们的应用程序需要以尽可能低的延迟转换它们。

在反转FFT时无法获得准确的数据

好吧,我想要实现的目标很简单。 对某些随机数据应用FFT,然后在输出上应用反向算法以获取输入。 我正在使用kissFFT库。 码: const int fft_siz = 512; const int inverse = 1; kiss_fft_cpx* in = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * fft_siz); kiss_fft_cpx* out = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * fft_siz); kiss_fft_cpx* rec = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * fft_siz); kiss_fft_cfg cfg = kiss_fft_alloc(fft_siz, !inverse, NULL, NULL); kiss_fft_cfg icfg = kiss_fft_alloc(fft_siz, inverse, NULL, NULL); srand((unsigned int)time(NULL)); for(int i = 0; i < fft_siz; […]

Cortex A9 NEON与VFP使用混淆

我正在尝试为Cortex A9 ARM处理器(更具体的OMAP4)构建一个库,我对于哪些\何时在浮点运算和SIMD中使用NEON vs VFP有点困惑。 需要注意的是,我知道2个硬件协处理器单元之间的区别(这也在SO上有所描述),我对它们的正确使用有一些误解。 与此相关我使用以下编译标志: GCC -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp ARMCC –cpu=Cortex-A9 –apcs=/softfp –cpu=Cortex-A9 –fpu=VFPv3 –apcs=/softfp 我已经阅读了ARM文档,很多wiki( 比如这个 ),论坛和博客post,每个人似乎都同意使用NEON比使用VFP或至少混合NEON更好(例如使用instrinsics来实现一些算法在SIMD)和VFP不是一个好主意; 如果这适用于整个应用程序\库的上下文或仅适用于代码中的特定位置(函数),我还不是100%确定。 所以我在我的应用程序中使用neon作为FPU,因为我也想使用内在函数。 结果我遇到了一些麻烦,我对如何在Cortex A9上最好地使用这些function(NEON vs VFP)的困惑只是进一步深化而不是清理。 我有一些代码为我的应用程序进行基准测试,并使用一些自定义的计时器类,其中计算基于双精度浮点。 使用NEON作为FPU会产生完全不合适的结果(尝试打印这些值会导致打印主要是inf和NaN;相同的代码在为x86构建时没有任何障碍)。 所以我改变了我的计算以使用单精度浮点, 据记载,NEON不处理双精度浮点 。 我的基准测试仍然没有给出正确的结果(最糟糕的是现在它在x86上不再起作用了;我认为这是因为精度损失但我不确定)。 所以我几乎完全迷失了:一方面我想使用NEON用于SIMDfunction并使用它,因为FPU没有提供正确的结果,另一方面将它与VFP混合似乎不是一个好主意。 在这方面的任何建议将不胜感激!! 我在上面提到的wiki的文章中找到了在NEON上下文中浮点优化应该做些什么的总结: “ 仅使用单精度浮点 当您发现瓶颈FPfunction时,请使用NEON内在函数/ ASM。 你可以比编译器做得更好。 最小化条件分支 启用RunFast模式 对于softfp: 内联浮点代码(除非它非常大) 通过指针而不是值传递FP参数,并在函数调用之间执行整数工作。 “ 我不能用于浮动ABI,因为我无法链接到我可用的库。 大多数的推荐对我来说都是有意义的(除了“runfast模式”,我不明白应该做什么以及此时我能做得比编译器更好的事实)但是我一直得到不一致的结果和我现在不确定。 任何人都可以了解如何正确使用浮点和NEON用于Cortex A9 […]