?π,派,3.1415926...,百度空間給顯示出來的,怎么好像是個《小門》。
用匯編語言編程的題目,要求輸入圓的半徑,計算出周長和面積。
求解這個題目,必須要用到圓周率 π 這個參數(shù)。
大家都知道,π 是無窮循環(huán)小數(shù)。編程時,很多人認為,要用到浮點數(shù)的運算。
有人為了省事,就直接用 3 來代表 π,呵呵,這個誤差,可就有些太大了。
如果采用 π 的近似值來計算,其實,也并不費事。
π 的近似值有兩種公式:
約率 = 22/7 ? ?= 3.1428571428571428571428571428571
密率 = 355/113 = 3.1415929203539823008849557522124
如果采用密率來計算,由此帶來的誤差小于 0.0000003。
這個精度,可說是相當?shù)母吡?,基本上,可以滿足任何需求。
乘以 335、除以 113,完全是用整數(shù)計算,算法簡單,速度極快,占用內(nèi)存空間也小。
用整數(shù)計算完畢后,在顯示的時候,則需要顯示小數(shù)點以及小數(shù)。
顯示小數(shù),很多人都不會的。
其實,只要編寫一個子程序,10 行而已,執(zhí)行一遍即可顯示一位小數(shù)。
下面的匯編語言程序,就是做而論道編寫的:輸入半徑r,計算周長,顯示四位小數(shù)。
;---------------------------
ASSUME ?CS:CC, DS:QW
;---------------------------
QW ?SEGMENT
? ? M1 ?DB ?13, 10, 'Please ?input ?r : $'
? ? M2 ?DB ?13, 10, 'L = $'
? ? M3 ?DB ?13, 10, 'OVER ! $'
? ? R1 ?DW ??
? ? S1 ?DW ??
? ? S2 ?DW ??
QW ?ENDS
;---------------------------
CC ?SEGMENT
START:
? ? MOV ? AX, QW
? ? MOV ? DS, AX
;
? ? LEA ? DX, M1
? ? MOV ? AH, 9
? ? INT ? 21H
? ? CALL ?INPUT
? ? MOV ? R1, CX
? ? ADD ? CX, CX
? ? MOV ? AX, 355
? ? MUL ? CX
? ? MOV ? CX, 113
? ? DIV ? CX
? ? MOV ? S1, AX ? ?;整數(shù)
? ? MOV ? S2, DX ? ?;余數(shù),即小數(shù)
DISP:
? ? LEA ? DX, M2
? ? MOV ? AH, 9
? ? INT ? 21H
? ? MOV ? AX, S1
? ? CALL ?OUTPUT
? ? MOV ? DL, '.' ? ;輸出小數(shù)點
? ? MOV ? AH, 2
? ? INT ? 21H
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? JMP ? EXIT
YICHU:
? ? LEA ? DX, M3
? ? MOV ? AH, 9
? ? INT ? 21H
EXIT:
? ? MOV ? AH, 4CH
? ? INT ? 21H ? ? ? ;返回DOS
;---------------------------
INPUT:
? ? MOV ? BL, 10
? ? MOV ? CX, 0
IN_X:
? ? MOV ? AH, 7
? ? INT ? 21H
? ? CMP ? AL, 13
? ? JE ? ?IN_END
? ? CMP ? AL, '0'
? ? JB ? ?IN_X
? ? CMP ? AL, '9'
? ? JA ? ?IN_X
? ? MOV ? DL, AL
? ? MOV ? AH, 2
? ? INT ? 21H
? ? MOV ? AL, DL
? ? SUB ? AL, 30H
? ? MOV ? AH, 0
? ? XCHG ?AX, CX
? ? MUL ? BL
? ? ADD ? CX, AX
? ? CMP ? CH, 0
? ? JNZ ? IN_END
? ? JMP ? IN_X
IN_END:
? ? RET
;---------------------------
OUTPUT: ? ? ? ?;輸出整數(shù)
? ? MOV ? BX, 10
? ? MOV ? CX, 0
OL1:MOV ? DX, 0
? ? DIV ? BX
? ? ADD ? DL, '0'
? ? PUSH ?DX
? ? INC ? CX
? ? CMP ? AX, 0
? ? JNZ ? OL1
? ? MOV ? AH, 2
OL2:POP ? DX
? ? INT ? 21H
? ? LOOP ?OL2
? ? RET
;---------------------------
OUTPUT_2: ? ? ?;輸出一位小數(shù)
? ? MOV ? AX, S2
? ? MOV ? CX, 10
? ? MUL ? CX
? ? MOV ? CX, 113
? ? DIV ? CX
? ? MOV ? S2, DX
? ? MOV ? DL, AL
? ? ADD ? DL, '0'
? ? MOV ? AH, 2
? ? INT ? 21H
? ? RET
;---------------------------
CC ?ENDS
? ? END ?START
;---------------------------
程序執(zhí)行后,顯示如下:
C:MASM>ww
Please ?input ?r : 50
L = 314.1592
C:MASM>
用整數(shù)計算,再顯示出來小數(shù),這個方法,是不是做而論道的獨創(chuàng)呢 ?
呵呵,應(yīng)該不能這么說。
可是,以前,確實,也沒有見誰發(fā)表過這種處理方法。