我正在尋找x86 Assembly中的pow(real, real)
的實現。另外我想了解算法的工作原理。如何在x86中使用pow(real,real)
26
A
回答
55
只要計算它爲2^(y*log2(x))
。
有一個x86指令FYL2X來計算y * log2(x)和一個x86指令F2XM1來進行指數運算。 F2XM1需要[-1,1]範圍內的參數,因此您必須在中間添加一些代碼以提取整數部分和餘數,然後取其餘部分,使用FSCALE以2的適當冪來縮放結果。
15
好的,我按照您的建議在x86中實現了power(double a, double b, double * result);
。
代碼:http://pastebin.com/VWfE9CZT
%define a QWORD [ebp+8]
%define b QWORD [ebp+16]
%define result DWORD [ebp+24]
%define ctrlWord WORD [ebp-2]
%define tmp DWORD [ebp-6]
segment .text
global power
power:
push ebp
mov ebp, esp
sub esp, 6
push ebx
fstcw ctrlWord
or ctrlWord, 110000000000b
fldcw ctrlWord
fld b
fld a
fyl2x
fist tmp
fild tmp
fsub
f2xm1
fld1
fadd
fild tmp
fxch
fscale
mov ebx, result
fst QWORD [ebx]
pop ebx
mov esp, ebp
pop ebp
ret
相關問題
- 1. 如何在Android中使用Elapsed Real Time?
- 2. x86 Real Mode中的USB控制
- 3. 爲什麼cc「real time」>>「real time」?
- 4. Android使用REAL unix時間
- 5. 我如何獲得Real IP?
- 6. memory_get_peak_usage()with「real usage」
- 7. ZODB In Real Life
- 8. Matlab LBP Real Valued
- 9. MVC Fileupload real contenttype
- 10. mysqli real escape string
- 11. Haproxy Real IP + Cloudflare
- 12. Android Real-Time Plotting
- 13. SQLite REAL錯誤
- 14. 「Real User」和API
- 15. 像Real Real Recipes一樣在頂部創建自定義菜單
- 16. 使用Spring MockMvc測試命中Real Server
- 17. sql type float,real,decimal?
- 18. android sqlite REAL類型
- 19. Scala Real Interval,Int Interval
- 20. UISlider和REAL時間
- 21. Python scipy/Fortran:float64,real,double?
- 22. Wordpress Real Cron Job HostGator
- 23. Android strace在Real設備上
- 24. KONY Preview使用仿真器/ Real Device
- 25. 使用iAd Network的Real Ads測試AdBannerView
- 26. OODBMS postgreSQL數組字段real使用?
- 27. 我如何處理表單提交使用PHP中的REAL OOP
- 28. 如何爲admob添加REAL ADS? Android
- 29. 如何創建REAL(KIND = 32)變量?
- 30. Javascript math power real/irrational_number library
您正在使用的x87或SSE? – 2011-01-09 09:28:51
glibc的`pow()`函數的實現是[在sysdeps/ieee754/dbl-64/e_pow.c]中(http://repo.or.cz/glibc.git/blob/HEAD:/sysdeps/ieee754/ DBL-64/e_pow.c)。它使用FP位模式的一些整數檢查,並且一些FP相乘並相加,但不使用任何特殊的x87指令。對於x86-64,它被編譯爲`__ieee754_pow_sse2()`([通過包含它的代碼](http://repo.or.cz/glibc.git/blob/455d6e4373c81da49892d39f33dc312b0c54097d:/sysdeps/x86_64/fpu/ multiarch/e_pow.c))。無論如何,x87並不是在現代CPU上實現它的最佳方式。 – 2016-09-19 02:28:37
我假設glibc的代碼要麼比x87更準確,要麼更快。可能兩者,但也許只是更準確(正確舍入到最近)。雖然它沒有使用循環,並且單步執行指令,但對於pow(1.175,33.75),沒有*那麼多。 FYL2X在現代CPU上是一個非常緩慢的指令(約100個週期),所以它不應該很難打敗它。 – 2016-09-19 02:30:57