全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1233
推到 Plurk!
推到 Facebook!

使用錯誤的float格式,如何避免當機?

答題得分者是:william
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-26 16:02:11 IP:218.160.xxx.xxx 未訂閱
使用錯誤的float格式,如何避免當機?  
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long a=2139113410;
  float *p=(float*)&a;
  long b;      try
  {
    b = *p;  // 執行到這一行就當機(死當)
  } catch(...){}
}
1.我有一些資料在檔案裡要作float的運算, 無奈檔案有些毀損, 以致讀進來的資料轉成float時,成為不正確的float格式,就像類似上面的狀況,每次執行到那一行就死當. 2.我的系統是win98 bcb5 3.錯誤的float格式就轉成零就好,不要當機就好. 4.不知各位先進是否也曾遇到這樣的問題?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-26 16:37:06 IP:147.8.xxx.xxx 未訂閱
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long a=2139113410;
  float *p=(float*)&a;
  long b;      try
  {
    if (IsNan(*p))
        b = 0
    else
        b = *p;
  } catch(...){}
}
Remember to include Math.hpp
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-26 17:15:19 IP:218.160.xxx.xxx 未訂閱
非常感謝william版主的回答, 但我有 include Math.hpp 可是還是出現 [C Error] Unit1.cpp(26): E2268 Call to undefined function 'IsNan' 我查過help也未發現有關 IsNan 的東東. 不知還要注意那一方面?如bcb版本...
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-27 12:19:44 IP:147.8.xxx.xxx 未訂閱
Oh.. I am using Kylix 3 (BCB)...    Could it help? http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20177836.html gcc: isnan() VC: _isnan() BCB: _isNAN()
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-27 13:58:25 IP:218.160.xxx.xxx 未訂閱
感謝william版主的回答, 理論上這是我要的答案, 但很歹勢, 還是會當機, 當在_isnan()這個function上.    1.理論上 try 應該就可攔截這個錯誤訊息. 2.我家用winxp+bcb5 可攔截這個錯誤訊息. 3.但公司用win98+bcb4&bcb5卻會當機,煩請各位先進, 假如是用win98+bcb4或win98+bcb5,可否幫我測一下,這個程式會不會當機,謝謝大家.  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long a=2139113410;
  float *p=(float*)&a;
  long b;      try
  {
    b = *p;  // 執行到這一行就當機(死當)
  } catch(...){}
}     
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-27 15:41:26 IP:218.173.xxx.xxx 未訂閱
引言:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long a=2139113410;
  float *p=(float*)&a;
  long b;      try
  {
    b = *p;  // 執行到這一行就當機(死當)
  } catch(...){}
}    
brook你好: 我幫你試過了,結果出現錯誤訊息,建議把float改成double,測過沒問題,結果 b = 0 因為我是看過本站文章提到,float變數並不準確,容易造成錯誤 改用double會比較好。
系統時間:2024-06-27 2:55:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!