首页
社区
课程
招聘
有关浮点运算,谁能进来解释一下???
发表于: 2006-7-5 16:06 4675

有关浮点运算,谁能进来解释一下???

2006-7-5 16:06
4675
vc 6.0 中
  //这段代码输出结果异常
        double x=4259.4;
        long y;
        x=x*100;
        y=long(x);
        printf("%d",y);
          结果为425939

//下面的结果正常
        double x=5259.4;
        long y;
        x=x*100;
        y=long(x);
        printf("%d",y);
        结果为 525940

为什么会是这样呢???

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
浮点操作的关系
2006-7-5 19:44
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我也知道是浮点操作的原因啊,难道是cpu的bug???
2006-7-6 00:37
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
你用的强制转换,参考IEEE的浮点表示标准,就知道原因了。
浮点和整型表示的方法区别很大,强制转换并不是截断小数点后面的数
2006-7-6 04:34
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
那为什么下面的代码又是截断小数点后面的数呢???
2006-7-6 18:59
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
6
浮点十进制值通常没有完全相同的二进制表示形式。这是 CPU 所采用的浮点数据表示形式的副作用。为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果。

导致此行为的原因是下面之一:

十进制数的二进制表示形式可能不精确。

使用的数字之间类型不匹配(例如,混合使用浮点型和双精度型)。

为解决此行为,大多数程序员或是确保值比需要的大或者小,或是获取并使用可以维护精度的二进制编码的十进制 (BCD) 库。

浮点值的二进制表示形式影响浮点计算的精度和准确性。Microsoft Visual C++ 使用 IEEE 浮点格式。

示例
  复制代码
// Floating-point_number_precision.c
// Compile options needed: none. Value of c is printed with a decimal
// point precision of 10 and 6 (printf rounded value by default) to
// show the difference
#include <stdio.h>

#define EPSILON 0.0001   // Define your own tolerance
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))

int main() {
   float a, b, c;

   a = 1.345f;
   b = 1.123f;
   c = a + b;
   // if (FLOAT_EQ(c, 2.468)) // Remove comment for correct result
   if (c == 2.468)            // Comment this line for correct result
      printf_s("They are equal.\n");
   else
      printf_s("They are not equal! The value of c is %13.10f "
                "or %f",c,c);
}

输出
  
They are not equal! The value of c is  2.4679999352 or 2.468000

备注
对于 EPSILON,可以使用常数 FLT_EPSILON(为浮点型定义为 1.192092896e-07F)或者 DBL_EPSILON(为双精度型定义为 2.2204460492503131e-016)。需要包含这些常数的 float.h。这些常数被定义为最小的正数 x,因此 x+1.0 不等于 1.0。因为这是非常小的数,所以对于涉及大数的计算应采用用户定义的公差。
2006-7-6 21:16
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
7
                     floor函数比较好
Calculates the floor of a value.

double floor(
   double x
);
float floor(
   float x
); // C++ only
long double floor(
   long double x
); // C++ only
float floorf(
   float x
);

Parameters
x
Floating-point value.

// crt_floor.c
// This example displays the largest integers
// less than or equal to the floating-point values 2.8
// and -2.8. It then shows the smallest integers greater
// than or equal to 2.8 and -2.8.

#include <math.h>
#include <stdio.h>

int main( void )
{
   double y;

   y = floor( 2.8 );
   printf( "The floor of 2.8 is %f\n", y );
   y = floor( -2.8 );
   printf( "The floor of -2.8 is %f\n", y );

   y = ceil( 2.8 );
   printf( "The ceil of 2.8 is %f\n", y );
   y = ceil( -2.8 );
   printf( "The ceil of -2.8 is %f\n", y );
}

Output
  
The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000

2006-7-6 21:24
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
在vb里面clng函数转换后又不会出现这种结果
2006-7-7 02:03
0
游客
登录 | 注册 方可回帖
返回
//