Is it delphi`s bug?????

何鲁青 2007-04-03 04:18:33
procedure TForm1.Button1Click(Sender: TObject);
var
tempInt: integer;
begin
tempInt := Floor((7.2 - 7) * 10);
showmessage(IntToStr(tempInt));
end;

//run the procedure behind and tell me why?
//why the result is 1 not 2????
//Is it delphi`s bug?
...全文
446 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
何鲁青 2007-04-25
  • 打赏
  • 举报
回复
有位高人指点道:
floor = round(x - 0.5);
ceil = round(x + 0.5);
何鲁青 2007-04-17
  • 打赏
  • 举报
回复
http://stephensuen.spaces.live.com/Blog/cns!1p1G_DGhjYiYGmj6keNZQAcw!172.entry
看了上面的文章,发现对于对于float认识太浅薄了,揭帖,给分,留解决方案。
何鲁青 2007-04-17
  • 打赏
  • 举报
回复
英语和浮点数有关系?
brightyang 2007-04-11
  • 打赏
  • 举报
回复
我晕....
你英语这么好不去读读关于浮点数的介绍.
zaza_bbface 2007-04-06
  • 打赏
  • 举报
回复
你才知道呀
何鲁青 2007-04-06
  • 打赏
  • 举报
回复
听到了新消息:李维去CodeGear了,呵呵!
zwjchina 2007-04-03
  • 打赏
  • 举报
回复
在single的情况下
无论 a:=0.500000003241342141234....后面怎么写
a = b都是成立的
因为,在内存中他们是一样的
zwjchina 2007-04-03
  • 打赏
  • 举报
回复
再给例子,你可以看看结果
procedure TForm1.Button1Click(Sender: TObject);
var
a, b: single;//double
begin
a := 0.5000000001;
b := 0.5;
if a = b then
ShowMessage('ok');

end;

类型分别换成single和double是有不同结果的,如果你不明白浮点数的话,会认为在single的情况下,delphi又出bug了.
zwjchina 2007-04-03
  • 打赏
  • 举报
回复
因为浮点数是不精确的数,只能和数很接近,但不一定等于该数
你可以找找资料看看浮点数的内存存储方式
其实,浮点数字随着阶码长度和尾数长度不同,其有意义的位数也是不同的.
比如我写的1.999999999999999999999,如果是single类型,有效数字只有8位
也就是 1.9999999469584和1.999999904343543在内存中的表示是无区别的,
换个角度说19999999324.0和119999999444也是没有区别的.
何鲁青 2007-04-03
  • 打赏
  • 举报
回复
7.2-7)*10 = 1.999999999999999999999999999999999999...
but why????
flashtong 2007-04-03
  • 打赏
  • 举报
回复
楼上的楼上证解
chenzhuo 2007-04-03
  • 打赏
  • 举报
回复
难道 7 = 7.00000000000000000000000000000000000000000000000000000000000000000001?
zwjchina 2007-04-03
  • 打赏
  • 举报
回复
不是BUG,是你对浮点数字理解不够。


Floor(1.99999999999)你觉得应该是多少?

(7.2-7)*10 = 1.999999999999999999999999999999999999...
(7.2-7)*10 != 2
chenzhuo 2007-04-03
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
tempInt: integer;
begin
tempInt := Floor((7.2 - 7.0) * 10);
showmessage(IntToStr(tempInt));
end;

这样可以,不知什么原因
chenzhuo 2007-04-03
  • 打赏
  • 举报
回复
搞不清楚,tempInt := Floor((7.2 - 7) * 100);
是会等于19,那么也就是说系统(7.2-7)*10=1.9
floor(1.9)=1,

var
tempInt: double;
i: Integer;
begin
tempInt := (7.2 - 7)* 100;
i := floor(tempInt);
showmessage(IntToStr(i));
end;

这样就可以了!呵呵
Red_angelX 2007-04-03
  • 打赏
  • 举报
回复
uouo
何鲁青 2007-04-03
  • 打赏
  • 举报
回复
upup!!!
内容概要:本文围绕基于Boost MPPT与双PI闭环双向DC-DC的离网光伏储能系统展开,系统性地研究了其动力学建模与稳态特性分析,并通过Simulink平台实现了完整的仿真验证。研究构建了涵盖光伏阵列、最大功率点跟踪(MPPT)控制、双向DC-DC变换器及储能电池的整体系统架构,采用Boost电路实现高效MPPT控制,并引入电压-电流双闭环PI控制策略,实现对储能系统精确的充放电管理。文章深入分析了系统在光照强度与环境温度双重扰动下的动态响应与稳态性能,验证了所提出模型的准确性与控制策略在不同工况下的鲁棒性与有效性,为离网光伏储能系统的优化设计与工程应用提供了坚实的理论基础和仿真依据。; 适合人群:具备电力电子技术、新能源系统或自动控制理论等相关专业知识背景,从事光伏储能系统、微电网或可再生能源领域研究与仿真的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握离网光伏储能系统的完整建模方法与关键参数设计流程;② 深入理解Boost电路MPPT控制与双向DC-DC变换器双PI闭环控制的协同工作机制与实现细节;③ 通过Simulink仿真分析系统在光照突变、温度变化等动态扰动下的稳态特性、电压稳定性和能量管理性能;④ 为实际离网系统的控制器设计、参数整定及性能优化提供可靠的理论指导和仿真验证手段。; 阅读建议:建议结合提供的Simulink仿真模型同步学习,重点关注MPPT算法的实现逻辑、双PI控制器的参数整定方法以及系统在不同环境条件和负载变化下的响应特性,可在此基础上进一步探索多目标优化控制或智能控制策略的应用。

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧