DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: david_
今日帖子: 3
在线用户: 10
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 smartdata (Jack) ★☆☆☆☆ -
普通会员
2022/5/23 13:55:45
标题:
加法计算运行出错,是何原因 浏览:429
加入我的收藏
楼主: #define AAAA 0xFF010000
void __fastcall TForm8::Button3Click(TObject* Sender)
{
  double n[] = { 1, 1.5, 1.7 };
  int index = AAAA + 1 * 1000;
  int index1 = AAAA + 1.0 * 1000;
  int index3 = AAAA + int(n[0] * 1000);
  int index2 = AAAA + n[0] * 1000;
}
IDE:RAD11.1,windows10
上述代码在传统编译器classic下面,结果正常,index、index1、index2、index3均=0xFF0103E8
而在Clang下编译,则运行时出错:
index=0xFF0103E8;
index1=0x3A1424;//变动
index2=0x80000000;
index3=0xFF0103E8;
同时报错:
First chance exception at $7281E09B. Exception class $C0000090 with message 'floating point invalid operation at 0x7281e09b'. Process Project5.exe (9720)

是上面代码问题还是RAD问题?
----------------------------------------------
==========
作者:
男 tuhemm (刀锋土禾) ▲△△△△ -
禁用账号
2022/5/23 17:02:43
1楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
发布无用信息,禁用帐号!
作者:
男 zhoutler (苦行僧) ★☆☆☆☆ -
普通会员
2022/5/23 17:39:42
2楼: int index2 = AAAA + n[0] * 1000;这行有问题吧,浮点数直接给整数?
int index1 = AAAA + 1.0 * 1000;这个结果没法说所谓的准确性,只能说精度。IEEE格式的浮点数就是精度问题,不像整数那么运算。
就像BASIC语言里面 2*2=4, 但2^2=3.9999999或者4.0000001一样,都很正常的,谈不上错误吧。如果要高精度运算,就要写方法,直接用运算符肯定不行。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2022/5/23 18:28:32
3楼: 直接运行以下C程序
#include<stdio.h>
#include<math.h>
#define AAAA 0xFF010000
int main(){
    double n[] = { 1, 1.5, 1.7 };
    int index = AAAA + 1 * 1000;
    int index1 = AAAA + 1.0 * 1000;
    int index3 = AAAA + (int)floor(n[0] * 1000);
    int index2 = AAAA + n[0] * 1000;
    printf("%x\n%x\n%x\n%x\n",index,index1,index2,index3);
    return 0;
}

CLANG运行结果:
ff0103e8
33333333
80000000
ff0103e8

GCC运行结果:
ff0103e8
7fffffff
80000000
ff0103e8
可见,在C的标准里,index1的结果就是未定义, index2的结果就是0x80000000
标准如此,只能说错的是C++ Builder的clasic编译器
----------------------------------------------
-
作者:
男 smartdata (Jack) ★☆☆☆☆ -
普通会员
2022/5/23 20:37:47
4楼: 浮点数赋值给整数编译器没转换,这是个教训。谢谢楼上各位!
----------------------------------------------
==========
作者:
男 smartdata (Jack) ★☆☆☆☆ -
普通会员
2022/5/23 20:41:36
5楼: to 3楼:
你测试运行下面这行后没报错吗?
int index2 = AAAA + n[0] * 1000;
C++Builder 允许给出结果0x80000000后就报下面错了:

 'floating point invalid operation at 0x7281e09b'
----------------------------------------------
==========
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
注册会员
2022/5/23 22:16:00
6楼: 這個故事是說, COMPILER 不是你肚子裏的蟲,誰知道你不同的TYPE 之間的運算
的結果想要什麼? 你自己不講清楚,我(COMPILER) 只好自己假設囉。
假設對了,你高興的我(開發者本人)天緃英明。假設錯了,你(COMPILER)他媽的什麼爛東西。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2022/5/24 1:47:20
7楼: @smartdata 我用的是C,不是C++, C并没有异常,通常靠检测errno来判断有没有错误。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行37.10938毫秒 RSS