gpt4 book ai didi

haskell - Haskell 中的 IEEE 浮点信令 NaN (sNaN)

转载 作者:行者123 更新时间:2023-12-04 08:35:15 24 4
gpt4 key购买 nike

有没有办法在 Haskell 中定义信号 NaN?我发现了两种处理 NaN 的方法:

1) 使用 0/0,产生相当 nan

2) 包Data.Number.Transfinite ,它也没有信号 NaN。

PS 有没有什么方法可以在不写C库的情况下将Word64逐位放入Double中?

最佳答案

我找到了一种非可移植方式:

{-# LANGUAGE ForeignFunctionInterface #-}
import Data.Word (Word64, Word32)
import Unsafe.Coerce
import Foreign
import Foreign.C.Types
foreign import ccall "fenv.h feenableexcept" -- GNU extension
enableexcept :: CInt -> IO ()

class HasNAN a where
signalingNaN :: a
quietNaN :: a

instance HasNAN Double where
signalingNaN = unsafeCoerce (0x7ff4000000000000::Word64)
quietNaN = unsafeCoerce (0x7ff8000000000000::Word64)

instance HasNAN Float where
signalingNaN = unsafeCoerce (0x7fa00000::Word32)
quietNaN = unsafeCoerce (0x7fc00000::Word32)

main = do
enableexcept 1 -- FE_INVALID in my system
print $ show $ 1 + (quietNaN :: Float) -- works
print $ show $ 1 + (signalingNaN :: Float) -- fails

这完全失败了。事实证明,FPU 异常对 Haskell 来说是个坏主意。默认情况下它们被禁用是有充分理由的。如果您在 gdb 中调试 C/C++/其他东西,它们就可以了。由于 Haskell 的非强制性性质,我不想调试 Haskell 核心转储。启用 FE_INVALID异常导致 0/0 并添加到 Data.Number.Transfinite 中的 NaN和 GHC.Real坠毁。但是在 enableexcept 之前计算的 0/0 不会另外产生异常。

我将在我的任务中使用一些简单的错误检查。我需要 sNaN仅在一处。

关于haskell - Haskell 中的 IEEE 浮点信令 NaN (sNaN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21344139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com