Se ho un numero in virgola mobile in Haskell, come faccio a testare se è un numero intero.Come si verifica se un numero in virgola mobile è un numero intero in haskell?
15
A
risposta
24
isInt x = x == fromInteger (round x)
> isInt 2
True
> isInt 2.5
False
E solo un promemoria: ricordare sempre la maledizione onnipotente dei numeri in virgola mobile:
> isInt (0.1^2*200)
False
> 0.1^2*200
2.0000000000000004
15
Okay, quindi questo è un anno di ritardo, ma io sono un grande fan di una modifica del quanto sopra:
--Returns if x is an int to n decimal places
isInt :: (Integral a, RealFrac b) => b -> a -> Bool
isInt x n = (round $ 10^(fromIntegral n)*(x-(fromIntegral $ round x)))==0
Così, per esempio isInt 4.0001 3
rendimenti True
ma isInt 4.0001 4
rendimenti False
. Eseguirlo con un valore intorno a 10
è quasi sempre sufficientemente preciso da rendere gli errori float ciò che restituisce i problemi; Io di solito uso 7
.
cool, c'è un built-in (per curiosità) – Peter
@Peter: no, secondo Hoogle. – yairchu
Attenzione che 'isInt (1/0) == True' – hvr