HP-UX的libc中具有的功能fesetflushtozero
切換「漸進下溢」和「零刷新」之間的浮點性能。等效fesetflushtozero()的
儘管通過幾種Unix的libc中的(包括glibc的),我還沒有找到如何實現同樣的事情在其它UNIX系統中的文件和手冊頁梳理。我特別感興趣的是Linux/glibc,Solaris和AIX。
HP-UX的libc中具有的功能fesetflushtozero
切換「漸進下溢」和「零刷新」之間的浮點性能。等效fesetflushtozero()的
儘管通過幾種Unix的libc中的(包括glibc的),我還沒有找到如何實現同樣的事情在其它UNIX系統中的文件和手冊頁梳理。我特別感興趣的是Linux/glibc,Solaris和AIX。
正如你所指出的,無疑,有做這個沒有標準的方式(對於這個問題,還有的「排擠至零」沒有標準的定義,也不是硬件實現它的任何要求)。因此,所有這些做法都是針對平臺的。要添加更多一些到列表中,因爲這是一個有用的參考:
OSX /英特爾:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)
。請注意,這是只有影響算術在float
或double
完成,這是使用SSE2(因此名稱)完成; long double
使用舊版x87指令執行算術,該指令不支持刷新。
式IO /臂:在iOS下32位ARM,沖洗到零是默認模式。您可以通過清除在fenv_t
對象__fpscr_flush_to_zero
位和安裝該環境fesetenv()
把它關閉對VFP指令(但不包括NEON)。
的iOS/arm64:fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)
。
我想知道爲什麼C99/UNIX標準函數fesetround(FE_TOWARDZERO)
不適合你 - 這在所有這些平臺上都是一樣的,包括HP/UX。
平臺特有的,你必須:
fesetflushtozero()
:nonstandard_arithmetic()
切換到零取整:找不到除fesetround()
之外的任何AIX s以上。
round-toward-zero和flush-to-zero具有完全不同的語義。 –
感謝Solaris函數,它可以滿足我的需求...但我認爲您的答案的其餘部分會將舍入模式和清零歸零 –