討論區快速選單
知識庫快速選單
討論區最近新進100則主題 網路投保旅行平安險 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
如何讓以下程式不會overflow
更改我的閱讀文章字型大小
作者 : a22662328(Shadow影)
[ 貼文 1 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/3/4 上午 01:21:56
嘗試寫出一個能夠把十進位數轉成二進位數的程式,但是輸入的數字只要在1024以上,就會跑出run-time error,訊息是integer arthmetic overflow,目前知道是當input>=1024時,10**int(log2(input))會超過2**10而無法繼續計算,請問該如何解決此問題?程式碼如下:

implicit none
character(len=1)::option
real::answer,input,count

1 continue
write(*,*)'Enter a decimal number,or enter a number less than 0,and it will exit:'
read(*,*)input

if(input==0) then
answer=0
write(*,*)'Binary number=',answer
goto 1

elseif (input>0) then
answer=10**int(log2(input))
count=2**int(log2(input))
count=input-count

while(count>0) do
answer=answer+10**int(log2(count))
count=count-2**int(log2(count))
enddo

write(*,*)'Binary number=',answer
goto 1

elseif(input<0) then
write(*,*)'Sure you want to end the program?(y/n)'
read(*,*)option

if(option=='y') then
endif

elseif(option=='n') then
goto 1

endif
end
作者 : changtenchun(qq) 貼文超過200則人氣指數超過30000點
[ 貼文 376 | 人氣 36017 | 評價 1040 | 評價/貼文 2.77 | 送出評價 69 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/3/21 上午 06:52:31
就程式概念而言
一般來說整數常宣告為integer*2,怕超過時 就宣告integer*4,
在超過時 只好宣告為實數real*4,怕超過或精度要求時就宣告為 real*8、
 再不行 就用矩陣方式(特別是大數時)。
就你問題而言因該不屬於(特別是大數時),用實數宣告就可
問題實際還是使用實數在做,只是你
的問題是整數~可能會使用需要實數轉整數的函數方法
如果還不成功只好使用矩陣做法(很像是大數的做法~搜尋~用 C 語言寫大數問題)參考看看

作者 : kib72377(史努比) Visual Basic卓越專家Assembly優秀好手Access頂尖高手貼文超過1000則
[ 貼文 1455 | 人氣 1891 | 評價 8600 | 評價/貼文 5.91 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/3/21 上午 09:06:23

關於 10**int(log2(input)),我想這是問題所在,
當input大於等於1024時,以它的算法,會產生 10,000,000,000 這樣的數字,
這對一個32位元暫存器來說,已經爆掉了,
所以結果值再assign給answer這個浮點數時也是錯的.
就算 改 10.0 ** int(x) ,變 int(x)先爆掉, 這樣也頂多擴充2進制的1個位數而已.

除非它能改64位元整數運算(效果有限),或是 改用其他的演算法去處理,
不然這就是極限了.

話說..簡單的 數值轉2進制,為什麼用 log 這樣高階的運算來處理?
作者 : changtenchun(qq) 貼文超過200則人氣指數超過30000點
[ 貼文 376 | 人氣 36017 | 評價 1040 | 評價/貼文 2.77 | 送出評價 69 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/3/25 上午 08:17:04
..簡單的 數值轉2進制,為什麼用 log 這樣高階的運算來處理?
以上方法常見到在組合語言中常使用並不適合於目前(fortran)
因為就數學而言如log(a*b)可以轉成log(a*b)=loga+logb
當乘法轉成加法使用、即log(10^3)=3*患底公式~等。
-而組合語言(masm)有所謂的ln庫存函數使用更加方便
在masm中除法是不便使用~她們常用移位元(bit)來取代
等。
而我們直覺想到的解題~參考看看
X=很大數(設實數)、X1實數
STEP1
X1=X MOD 2 <~~取餘數
X=X/2
INT2(X1)<~~取整數儲存起來準備輸出(需要做倒續輸出
在組合語言既所謂的push、pop問題~~還滿有名)
IF X= 0.0 則停止 否則跳至 STEP1
 板主 : 徵求中
 > Fortran - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Fortran - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Fortran
1 f77f95 3300 
2 dennis 470 
3 cc 350 
4 smallpotato 320 
5 qq 290 
6 冼鏡光 230 
7 eraser 220 
8 小文 210 
9 iner 200 
10 wuda 160 
Fortran
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875