Ich habe den folgende C-Code:Pass Zeiger auf ein Array in Haskell zu einer C-Funktion
#include <sys/times.h>
#include <time.h>
float etime_(float *tarray)
{ struct tms buf;
times(&buf);
tarray[0] = 1.0 * buf.tms_utime/CLOCKS_PER_SEC;
tarray[1] = 1.0 * buf.tms_stime/CLOCKS_PER_SEC;
return tarray[0] + tarray[1];
}
diesen Fortran-Code zu Haskell zu Port Versuch:
PROGRAM Test
IMPLICIT NONE
REAL t, ta(2), etime
INTEGER i
DOUBLE PRECISION x
do i = 1, 10000
x = sin(cos(i * 1.0 d0))
print *, x
enddo
ta(1) = 0.0d0
ta(2) = 0.0d0
t = etime(ta)
PRINT *, 'user time: ', ta(1)
PRINT *, 'system time: ', ta(2)
PRINT *, 'process time: ', t
END
Wie kann ich Array definieren und ! oder !!! für den folgenden Code zu arbeiten?
module Main where
import GHC.Ptr
import GHC.Prim
import System.IO.Unsafe
import Control.Monad
foreign import ccall etime_ :: Ptr Double → IO Double
etime = etime_
main :: IO Int
main = do
mapM_ (print . sin . cos . (* (1.0 :: Double)) . fromIntegral) [1..10000 :: Int]
ta ← array 2
t ← etime ta
putStrLn $ "user time: " ++ show (ta !!! 0)
putStrLn $ "system time: " ++ show (ta !!! 1)
putStrLn $ "process time: " ++ show t
return 0
array :: Int → IO (Ptr a)
array size = undefined
(!) :: Ptr a → Int → IO a
(!) = undefined
(!!!) :: Ptr a → Int → a
(!!!) = undefined
Gibt es einen Präzisionsunterschied zwischen Float und Double in Haskell? sind beide Primitive oder float zu double wie ganze Zahl zu int? –
Ja: Das Prelude definiert Float und Double für Gleitkommazahlen mit einfacher und doppelter Genauigkeit. Siehe Abschnitt "Zahlen" des Haskell-Berichts: http://www.haskell.org/onlinereport/basic.html#sect6.4 –