Tag: 浮点

什么是在x86上提供无分支FP min和max的指令?

引用(感谢作者开发和共享算法!): Fast, Branchless Ray/Bounding Box Intersections 由于现代浮点指令集可以在没有分支的情况下计算最小值和最大值 作者的相应代码就是 dmnsn_min(double a, double b) { return a < b ? a : b; } 我熟悉例如_mm_max_ps ,但这是一个向量指令。 上面的代码显然是用于标量forms。 题: 什么是x86上的标量无分支minmax指令? 这是一系列指令吗? 假设它将被应用,或者如何调用它是否安全? 关于min / max的无分支问题是否有意义? 根据我的理解,对于光线跟踪器和/或其他视觉软件,给定光线盒交叉例程,分支预测器没有可靠的模式来拾取,因此消除分支确实有意义。 我是对的吗? 最重要的是,所讨论的算法是围绕(+/-)INFINITY进行比较而建立的。 这是可靠的,我们正在讨论的(未知)指令和浮点标准吗? 以防万一:我熟悉在C ++中使用min和max函数 ,相信它是相关的,但不是我的问题。

C编译器bug(浮点运算)?

#include int main() { double fract=0; int tmp; //scanf(“%lf”,&fract); fract=0.312; printf(“%lf”,fract); printf(“\n\n”); while(fract>0){ fract*=(double)10; printf(“%d “,(int)fract); fract-=(int)fract; } getch(); return 0; } 这段代码的输出为:312 但是某些东西不对..我正在使用devcpp 4.9.9.2编译器……

我打印时,我的浮点数有额外的数字

我将浮点数定义为float transparency = 0.85f; 在下一行中,我将它传递给函数 – fcn_name(transparency) – 但事实certificate变量transparency值为0.850000002 ,当我使用默认设置打印时,它为0.850000002 。 对于值0.65f ,它是0.649999998 。 我该如何避免这个问题? 我知道浮点只是一个近似值,但如果我定义一个只有几位小数的浮点数,我怎样才能确定浮点数没有改变?

如何加快浮点到整数转换?

我们在项目中进行了大量的浮点数到整数转换。 基本上,这样的事情 for(int i = 0; i < HUGE_NUMBER; i++) int_array[i] = float_array[i]; 执行转换的默认C函数非常耗时。 是否有任何工作(可能是手动调整function)可以加快一点点的过程? 我们不太关心精度。

SSE寄存器返回SSE禁用

我遇到以下情况: 我正在为不允许SSE指令的内核编写代码 我需要做浮点运算 我正在为x86_64平台编译 这是一个代码示例,说明了问题: int main(int argc, char** argv) { double d = 0.0, dbase; uint64_t base_value = 300; d = (2200.0 – 1000.0)/(1000.0); dbase = d * base_value; printf(“d = %f, dbase = %f\n”, d, dbase); base_value = dbase; printf(“base_value = %llu\n”, (long long unsigned)base_value); return 0; } 这是makefile中的相关行: CFLAGS += -mcmodel=kernel -mno-red-zone […]

如何在TurboC中启用链接浮点库?

我是C语言的新手……只是想问一下如何在TurboC中启用链接浮点库?

当浮点变量超出浮动限制时,会发生什么?

我说了两件事: std::numeric_limits::max()+(a small number) 给出: std::numeric_limits::max() 。 std::numeric_limits::max()+(a large number如: std::numeric_limits::max()/3) 给出 inf。 为何如此差异? 1或2会导致OVERFLOW导致未定义的行为吗? 编辑:测试此代码: 1。 float d = std::numeric_limits::max(); float q = d + 100; cout << "q: " << q << endl; 2。 float d = std::numeric_limits::max(); float q = d + (d/3); cout << "q: " << q << endl;

pow()转换为整数,意外结果

我在C编程语言中使用整数强制转换为pow()函数时遇到了一些问题。 我正在使用的编译器是Windows平台的Tiny C编译器 (tcc版本0.9.24)。 执行以下代码时,它输出意外结果100, 99 : #include #include int main(void) { printf(“%d, “, (int) pow(10, 2)); printf(“%d”, (int) pow(10, 2)); return 0; } 但是,在此在线编译器中,输出符合预期: 100, 100 。 我不知道是什么导致了这种行为。 有什么想法吗? 我编程错误,编译错误?

变量函数(va_arg)不适用于float?

我有一个variadic函数,它接受一个float参数。 为什么不起作用? va_arg(arg, float)

C-浮点精度

我有一个程序: int main() { float f = 0.0f; int i; for (i = 0 ; i < 10 ; i++) f = f + 0.1f; if (f == 1.0f) printf("f is 1.0 \n"); else printf("f is NOT 1.0\n"); return 0; } 它始终打印f is NOT 1.0 。 我知道这与C中的浮点精度有关。但我不确定它到底搞砸了。 有人可以解释一下为什么不打印另一条线?