亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

C標準庫源碼解剖(12):浮點數環境fenv.h

2024-07-10 13:27:18
字體:
來源:轉載
供稿:網友

為了編寫高精度浮點數的運算,編程人員需要控制浮點數環境的各個方面:結果如何舍入,浮點數表達式如何簡化與變換,如何處理浮點數異常(如下溢之類的浮點數異常是忽略還是產生錯誤),等等。C99引入了fenv.h來控制浮點數環境。
    1、fenv.h: 定義了浮點數環境控制函數、異??刂坪瘮?、舍入方式控制函數、浮點數異常碼和舍入方式等。注意浮點數環境的實現是依賴于體系結構的,因為不同的體系結構有不同的浮點數指令集。依賴于體系結構的定義放在bits/fenv.h中,這里是x86體系結構的版本(Linux下)。
    標準頭文件fenv.h內容如下:

 

[cpp] view plaincopy
  1. /* ISO C99 7.6: 浮點數環境   <fenv.h> */  
  2. #ifndef _FENV_H  
  3. #define _FENV_H 1  
  4. #include <features.h>  
  5. /* 獲取依賴于體系結構的定義。應該要有下面這些定義: 
  6.    fenv_t   表示浮點數環境的類型 
  7.    FE_DFL_ENV   fenv_t *指針類型的值,表示浮點數環境的缺省值(用于需要fenv_t參數的函數中) 
  8.    fexcept_t    表示浮點數異常標志(這個標志保存了浮點數的狀態)的類型 
  9.     下面的宏被定義,當且僅當實現支持這些宏時: 
  10.    FE_INEXACT       不精確的結果 
  11.    FE_DIVBYZERO     除數為0 
  12.    FE_UNDERFLOW     結果向下溢出 
  13.    FE_OVERFLOW      結果向上溢出 
  14.    FE_INVALID       無效的運算 
  15.    FE_ALL_EXCEPT    所有被支持的異常的按位或 
  16.    下面這些宏被定義,當且僅當實現支持某些適當的舍入方式時: 
  17.    FE_TONEAREST     最近舍入 
  18.    FE_UPWARD        向正無窮大(+Inf)舍入 
  19.    FE_DOWNWARD      向負無窮大(-Inf)舍入 
  20.    FE_TOWARDZERO    向0舍入 
  21. */  
  22. #include <bits/fenv.h>  
  23. __BEGIN_DECLS  
  24. /* 浮點數異常處理  */  
  25. /* 清除EXCEPTS表示的異常狀態  */  
  26. extern int feclearexcept (int __excepts) __THROW;  
  27. /* 將實現定義的異常標志EXCEPTS保存到FLAGP所指的對象中 */  
  28. extern int fegetexceptflag (fexcept_t *__flagp, int __excepts) __THROW;  
  29. /* 產生由EXCEPTS表示的異常 */  
  30. extern int feraiseexcept (int __excepts) __THROW;  
  31. /* 根把EXCEPTS異常標志設置為FLAGP所指對象中的值 */  
  32. extern int fesetexceptflag (__const fexcept_t *__flagp, int __excepts) __THROW;  
  33. /* 確定EXCEPTS指示的各個異常中有哪個異常子集被設置了 */  
  34. extern int fetestexcept (int __excepts) __THROW;  
  35. /* 舍入控制  */  
  36. /* 獲得當前的舍入方向,表示為一個舍入方向宏值  */  
  37. extern int fegetround (void) __THROW;  
  38. /* 設置舍入方向,成功時返回0  */  
  39. extern int fesetround (int __rounding_direction) __THROW;  
  40. /* 浮點數環境  */  
  41. /* 獲取當前的浮點數環境,并保存在ENVP所指的對象中 */  
  42. extern int fegetenv (fenv_t *__envp) __THROW;  
  43. /* 將當前浮點數環境保存到ENVP所指對象中,清除異常標志,然后安裝一個不停止的浮點數環境(即 
  44.     忽略所有浮點數異常) */  
  45. extern int feholdexcept (fenv_t *__envp) __THROW;  
  46. /* 設置浮點數環境 */  
  47. extern int fesetenv (__const fenv_t *__envp) __THROW;  
  48. /* 將當前浮點數環境保存到一個臨時存儲中,然后安裝ENVP所指的環境,并根據保存的異常環境 
  49.     產生異常 */  
  50. extern int feupdateenv (__const fenv_t *__envp) __THROW;  
  51.   
  52. /* 下面包含了一些作為擴展的優化函數  */  
  53. #ifdef __OPTIMIZE__  
  54. # include <bits/fenvinline.h>  
  55. #endif  
  56. #ifdef __USE_GNU  
  57. /* 激活個別的異常,激活的個數不會多于EXCEPTS指示的異常個數。如果所有異常被成功設置,則返回 
  58.     以前激活的異常,否則返回-1 */  
  59. extern int feenableexcept (int __excepts) __THROW;  
  60. /* 禁用個別的異常,禁用的異常個數不會多于EXCEPTS指示的異常個數。如果所有異常被成功禁用, 
  61.     則返回先前激活的異常,否則返回-1 */  
  62. extern int fedisableexcept (int __excepts) __THROW;  
  63. /* 返回激活的異常  */  
  64. extern int fegetexcept (void) __THROW;  
  65. #endif  
  66. __END_DECLS  
  67. #endif /* fenv.h */  

 

    bits/fenv.h內容如下:

 

[cpp] view plaincopy
  1. /* bits/fenv.h:定義了浮點數異常碼,x86體系結構的版本(Linux下)  */  
  2. #ifndef _FENV_H  
  3. # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."  
  4. #endif  
  5. #include <bits/wordsize.h>  
  6. /* 定義代表異常的位,我們使用FPU控制字中適當的位 */  
  7. enum  
  8.   {  
  9.     FE_INVALID = 0x01,           /* 無效的運算 */  
  10. #define FE_INVALID  FE_INVALID  
  11.     __FE_DENORM = 0x02,  
  12.     FE_DIVBYZERO = 0x04,        /* 除數為0 */  
  13. #define FE_DIVBYZERO    FE_DIVBYZERO  
  14.     FE_OVERFLOW = 0x08,        /* 結果向上溢出 */  
  15. #define FE_OVERFLOW FE_OVERFLOW  
  16.     FE_UNDERFLOW = 0x10,       /* 結果向下溢出 */  
  17. #define FE_UNDERFLOW    FE_UNDERFLOW  
  18.     FE_INEXACT = 0x20          /* 不精確的結果 */  
  19. #define FE_INEXACT  FE_INEXACT  
  20.   };  
  21. /* 所有異常的按位或 */  
  22. #define FE_ALL_EXCEPT /  
  23.     (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)  
  24. /* ix87 FPU支持所有四種已經定義的舍入模式。我們又使用FPU控制字中位作為相應宏的值 */  
  25. enum  
  26.   {  
  27.     FE_TONEAREST = 0,         /* 最近舍入 */  
  28. #define FE_TONEAREST    FE_TONEAREST  
  29.     FE_DOWNWARD = 0x400,  
  30. #define FE_DOWNWARD FE_DOWNWARD  
  31.     FE_UPWARD = 0x800,       /* 向負無窮舍入 */  
  32. #define FE_UPWARD   FE_UPWARD  
  33.     FE_TOWARDZERO = 0xc00    /* 向正無窮舍入 */  
  34. #define FE_TOWARDZERO   FE_TOWARDZERO  
  35.   };  
  36.   
  37. /* 代表異常標志的類型  */  
  38. typedef unsigned short int fexcept_t;  
  39. /* 代表浮點數環境的類型。這個與塊的布局有關的結構由fstenv指令寫入,并且有另外的域作為 
  40.    MXCSR寄存器的內容,這個寄存器由stmxcsr指令寫入 */  
  41. typedef struct  
  42.   {  
  43.     unsigned short int __control_word;  
  44.     unsigned short int __unused1;  
  45.     unsigned short int __status_word;  
  46.     unsigned short int __unused2;  
  47.     unsigned short int __tags;  
  48.     unsigned short int __unused3;  
  49.     unsigned int __eip;  
  50.     unsigned short int __cs_selector;  
  51.     unsigned int __opcode:11;  
  52.     unsigned int __unused4:5;  
  53.     unsigned int __data_offset;  
  54.     unsigned short int __data_selector;  
  55.     unsigned short int __unused5;  
  56. #if __WORDSIZE == 64  
  57.     unsigned int __mxcsr;  
  58. #endif  
  59.   }  
  60. fenv_t;  
  61. /* 缺省的浮點數環境:使用下面這個值  */  
  62. #define FE_DFL_ENV  ((__const fenv_t *) -1)  
  63. #ifdef __USE_GNU  
  64. /* 沒有任何異常被屏蔽的浮點數環境  */  
  65. # define FE_NOMASK_ENV  ((__const fenv_t *) -2)  
  66. #endif  

 

    標準C中指定的接口有:
    (1)浮點數環境類型:fenv_t,是一個結構體,里面的成員依賴于體系結構。
    (2)浮點數環境的缺省值:FE_DFL_ENV,是一個fenv_t *指針類型的值(為-1),用于需要fenv_t參數的函數中。
    (3)浮點數異常標志類型:fexcept_t,為unsigned short類型。異常標志中保存了浮點數的狀態。
    (4)浮點數異常:FE_INEXACT, FE_DIVBYZERO, FE_UNDERFLOW, FE_OVERFLOW, FE_INVALID, FE_ALL_EXCEPT。
    (5)浮點數舍入方式:FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO。
    (6)浮點數環境控制函數:fegetenv, fesetenv, feholdexcpet, feupdateenv。
    (7)浮點數異常處理函數:fegetexceptflag, fesetexceptflag, fetestexcept, feraiseexcept, feclearexcept。
    (8)浮點數舍入控制函數:fegetround, fesetround。
    2、浮點數環境、異常、舍入控制函數的實現: 這些函數的實現都是依賴于體系結構的,x86體系結構的部分在glibc源碼的sysdeps/i386/fpu目錄下。每個函數對應一個C語言源文件,由于要用到浮點數操作指令,因此都嵌入了匯編代碼。這些函數的功能都非常簡單,主要是通過fenv_t的實例或fexcept_t的實例來獲取或設置相應的值,因此代碼都不長,要理解這些代碼,主要是要對x86體系結構有全面的了解。由于代碼依賴于體系結構,也沒有特別值得研究的獨立于體系結構的算法,因此這里并不打算解剖它們的源代碼。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合久久久久| 欧美性受xxxx白人性爽| 亚洲色无码播放| 91视频-88av| 国产精品久久久久国产a级| 精品视频在线播放色网色视频| 国产精品无av码在线观看| 另类专区欧美制服同性| 伊人久久大香线蕉av一区二区| 深夜精品寂寞黄网站在线观看| 亚洲欧美精品一区| 国产欧美日韩精品专区| 97人人做人人爱| 国语自产在线不卡| 国产精品欧美日韩久久| 亚洲第一区在线观看| 国产一区香蕉久久| 黑人巨大精品欧美一区二区| 国产精品视频xxxx| 亚洲电影在线观看| 亚洲精品视频网上网址在线观看| 亚洲国产天堂网精品网站| 久久综合国产精品台湾中文娱乐网| 色综合五月天导航| 日韩精品视频在线| 亚洲free性xxxx护士白浆| 欧美激情亚洲另类| 4438全国亚洲精品在线观看视频| 国产精品视频xxxx| 色午夜这里只有精品| 久久久久久久电影一区| 成人久久久久久| 国内精品久久久久伊人av| 国产精品扒开腿做| 亚洲精品videossex少妇| xvideos国产精品| 国产精品欧美激情在线播放| 中文字幕综合一区| 一区二区三区四区精品| 日韩av一区在线观看| 色偷偷偷综合中文字幕;dd| 欧美日韩亚洲成人| 色中色综合影院手机版在线观看| 精品久久久久久久中文字幕| 国产亚洲精品91在线| 欧美日韩aaaa| 91国内精品久久| 日韩视频在线免费观看| 最近2019年日本中文免费字幕| 最新中文字幕亚洲| 在线电影欧美日韩一区二区私密| 91久久夜色精品国产网站| 久久免费视频这里只有精品| 久久久亚洲国产| 日韩av成人在线观看| 中文欧美日本在线资源| 国产香蕉97碰碰久久人人| 5566成人精品视频免费| 亚洲成色999久久网站| 欧美中文在线字幕| 成人黄在线观看| 精品色蜜蜜精品视频在线观看| 深夜精品寂寞黄网站在线观看| 久久久久久久久久久久av| 国产美女扒开尿口久久久| 色狠狠av一区二区三区香蕉蜜桃| 亚洲精品电影网| 国产精品成人品| 成人性生交大片免费看小说| 久久精彩免费视频| 国产精品久久久久久久久久久久久| 日韩av手机在线| 亚洲性视频网址| 日韩经典第一页| 国产精品久久久久久影视| 欧美日韩亚洲精品内裤| 琪琪亚洲精品午夜在线| 欧洲成人在线视频| 国产日韩欧美在线| 国产成人精品日本亚洲专区61| 国产精品久久久久久久久免费| 亚洲va久久久噜噜噜| 国产三级精品网站| 国产区亚洲区欧美区| 亚洲成人av在线播放| 国产成人精品电影| 日韩国产一区三区| 精品国产成人av| 国产精品国产福利国产秒拍| 欧美成人黄色小视频| 欧美影院在线播放| 色偷偷av一区二区三区| 丝袜亚洲另类欧美重口| 国产精品白丝av嫩草影院| 韩剧1988免费观看全集| 日韩在线激情视频| 91精品国产自产91精品| 国产综合福利在线| 亚洲成成品网站| www.日韩.com| 国产精品自在线| 91精品国产自产在线观看永久| 奇米成人av国产一区二区三区| 日韩中文字幕视频在线观看| 一本大道亚洲视频| 国产欧美精品日韩| 亚洲免费视频网站| 久久夜色精品亚洲噜噜国产mv| 久久久久久999| 国产精品成人一区| 亚洲图中文字幕| 国内精品400部情侣激情| 欧洲日本亚洲国产区| 成人深夜直播免费观看| 亚洲已满18点击进入在线看片| 高清欧美性猛交xxxx黑人猛交| 欧美大尺度激情区在线播放| 欧洲美女7788成人免费视频| 日本中文字幕久久看| 日韩成人xxxx| 中文字幕视频在线免费欧美日韩综合在线看| 欧美一区二区大胆人体摄影专业网站| 国产精品成人av性教育| 日韩美女视频免费在线观看| 亚洲国产精品va在线看黑人| 久久成人国产精品| 国产精品久久久久免费a∨大胸| 欧美乱人伦中文字幕在线| 国产亚洲精品久久久| 亚洲欧洲日产国产网站| 国产精品成人久久久久| 日韩中文字幕免费| 国产精品久久久久久久久久三级| 欧美大学生性色视频| 国产精品久久久久久久av大片| 亚洲欧美国产一区二区三区| 亚洲美女中文字幕| 日韩在线www| 久久在线免费视频| 97成人精品视频在线观看| 中文字幕无线精品亚洲乱码一区| 精品动漫一区二区三区| 国产精品一区二区av影院萌芽| 亚洲bt欧美bt日本bt| 日韩欧美在线中文字幕| 久久久久久999| 亚洲国产精品999| 亚洲一区二区三区香蕉| 日韩一区二区三区在线播放| 国产不卡在线观看| 亚洲香蕉成人av网站在线观看| 久久久久久亚洲精品不卡| 国产精品成久久久久三级| 中文字幕欧美视频在线| 久久人人97超碰精品888| 国产亚洲欧洲高清一区| 亚洲欧美日韩国产精品| 日韩成人小视频| 97在线看福利| 91性高湖久久久久久久久_久久99| 国产网站欧美日韩免费精品在线观看| 亚洲欧美成人在线| 亚洲毛片在线免费观看| 亚洲另类欧美自拍|