Tag: 浮点

May C可以使用多种浮点格式进行评估吗?

C 2011 [N1570] 5.2.4.2.2 9说: 除了赋值和转换…之外,具有浮动操作数的运算符产生的值和通常算术转换以及浮动常量的值将被评估为其范围和精度可能大于该类型所需的格式。 这是否意味着可以使用一种格式评估实现中的所有浮点运算,或者可以使用更大范围和精度的格式评估每个运算? 如果用额外精度评估的A*B与用标称精度评估的A*B不同,后者将允许A*B == A*B评估为假。

使用float而不是double时输出奇怪

当我使用float而不是double时输出奇怪的输出 #include void main() { double p,p1,cost,cost1=30; for (p = 0.1; p < 10;p=p+0.1) { cost = 30-6*p+p*p; if (cost<cost1) { cost1=cost; p1=p; } else { break; } printf("%lf\t%lf\n",p,cost); } printf("%lf\t%lf\n",p1,cost1); } 在p = 3时给出预期的输出; 但是当我使用float输出有点奇怪。 #include void main() { float p,p1,cost,cost1=40; for (p = 0.1; p < 10;p=p+0.1) { cost = 30-6*p+p*p; if (cost<cost1) […]

奇怪的printf输出

我执行了以下代码 #include int main() { printf(“%f\n”, 9/5); } 输出: 0.000000 为什么不1 ? 如果我写printf(“%f %f %d %d\n”, (float)9/5, 4, sizeof(float), sizeof(int)); 然后输出是1.800000 0.000000 4 59 为什么不1.800000 4 4 4 在我的机器上, sizeof (float)是4 提前致谢

C将浮点数转换为int

我正在使用C (不是C ++)。 我需要将浮点数转换为int 。 我不想舍入到最接近的数字,我只是想消除整数部分之后的内容。 就像是 4.9 – > 4 .9 – > 4

涉及sin()的两个非常相似的函数表现出截然不同的性能 – 为什么?

考虑以下两个以两种不同方式执行相同计算的程序: // v1.c #include #include int main(void) { int i, j; int nbr_values = 8192; int n_iter = 100000; float x; for (j = 0; j < nbr_values; j++) { x = 1; for (i = 0; i < n_iter; i++) x = sin(x); } printf("%f\n", x); return 0; } 和 // v2.c #include #include […]

Pow实现双倍

我正在开发一个将用于运动控制的代码,我遇到了powfunction的问题。 我使用VS2010作为IDE。 这是我的问题:我有: double p = 100.0000; double d = 1000.0000; t1 = pow((p/(8.0000*d),1.00/4.000); 在评估最后一个函数时,我得不到更好的近似值。 我得到一个正确的7位十进制数字,结果数字都是垃圾。 我猜测pow函数只将任何输入变量转换为float和过程与计算。 我对吗? 如果是这样,是否有任何代码我可以“重新启动”以获得更好的精度? 编辑:解决了。 毕竟,我遇到了由OGRE 3D框架正在使用的Direct3D引起的FPU配置位问题。 如果使用OGRE,在配置GUI上,只需设置“浮点模式=一致”。 如果使用原始Direct3D,在调用CreateDevice时,请确保将“D3DCREATE_FPU_PRESERVE”标志传递给它。 原帖: 您可能正在使用将FPU的默认精度更改为单精度的libray。 然后,所有浮点运算,即使是双精度运算,也将实际作为单精度运算执行。 作为测试,您可以尝试调用_controlfp(_CW_DEFAULT,0xfffff); (您需要包括)在执行计算之前,看看是否得到了正确的结果。 这会将浮点控制字重置为默认值。 请注意,它也会重置其他设置,这可能会导致问题。 一个改变浮点精度的公共库是Direct3D 9(也可能是其他版本):默认情况下,它在创建设备时将FPU更改为单精度。 如果使用它,请在创建设备时指定标志D3DCREATE_FPU_PRESERVE以防止其更改FPU精度。

Float32到Float16

有人可以向我解释如何将32位浮点值转换为16位浮点值吗? (s =符号e =指数,m =尾数) 如果32位浮点数是1s7e24m 16位浮点数为1s5e10m 那么这么简单吗? int fltInt32; short fltInt16; memcpy( &fltInt32, &flt, sizeof( float ) ); fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14; fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) <> 16); 我假设它不是那么简单……所以有人能告诉我你需要做什么吗? 编辑:我看到我的指针转移错误了…所以这会更好吗? fltInt16 = (fltInt32 & 0x007FFFFF) >> 13; fltInt16 |= (fltInt32 & 0x7c000000) >> 13; fltInt16 |= (fltInt32 & […]

加倍和除以浮点值

我有一个函数,我相信将int转换为浮点值,拆分为值的符号指数和分数组成部分。 使用IEEE 754表示浮点值。 unsigned test(unsigned x) { // split the given bits of sign exponent and fraction, combine to return unsigned int sign = (x & 0x80000000) >> 31; unsigned int expo = (x & 0x7F800000) >> 23; unsigned int frac = (x & 0x007fffff); return (sign << 31) | (expo << 23) | frac; […]

浮点乘法执行速度较慢,具体取决于C中的操作数

我正在对以前从文件中读取的矩阵执行模板计算。 我使用两种不同的矩阵(NonZero类型和Zero类型)。 两种类型共享边界的值(通常为1000),而其余元素对于零类型为0,对于NonZero类型为1。 该代码将文件的矩阵存储在两个相同大小的分配矩阵中。 然后,它使用自己的值和邻居值(添加x 4和mul x 1)在一个矩阵的每个元素中执行操作,并将结果存储在第二个矩阵中。 一旦计算完成,交换矩阵的指针并且执行相同的操作有限次数。 在这里你有核心代码: #define GET(I,J) rMat[(I)*cols + (J)] #define PUT(I,J) wMat[(I)*cols + (J)] for (cur_time=0; cur_time<timeSteps; cur_time++) { for (i=1; i<rows-1; i++) { for (j=1; j<cols-1; j++) { PUT(i,j) = 0.2f*(GET(i-1,j) + GET(i,j-1) + GET(i,j) + GET(i,j+1) + GET(i+1,j)); } } // Change pointers for next iteration auxP […]

比较从字符串转换的浮点值与文字

这并不是着名的浮动数学数据的重复,即使它看起来像乍一看。 我正在使用fscanf(file, “%lf”, &value);从文本文件中读取一个double fscanf(file, “%lf”, &value); 并将它与==运算符与双字面值进行比较。 如果字符串与文字相同,那么在所有情况下使用==的比较是否都是true ? 例 文字文件内容: 7.7 代码段: double value; fscanf(file, “%lf”, &value); // reading “7.7” from file into value if (value == 7.7) printf(“strictly equal\n”); 预期和实际产出是 strictly equal 但是这假设编译器将双文字7.7转换为与fscanf函数完全相同的双fscanf ,但编译器可能会也可能不会使用相同的库将字符串转换为double。 或者另有要求:从字符串到double的转换是否会产生唯一的二进制表示forms,或者可能存在轻微的实现依赖性差异? 现场演示