profiling problems

Damien R. Sullivan dasulliv@cs.indiana.edu
Tue, 25 Feb 2003 19:42:35 -0500


I have this code which compiles and runs normally, but gives bus errors or
segfaults at run time when compiled with -prof -auto-all.  ghc-5.04
SunOS cownose.cs.indiana.edu 5.8 Generic_108528-18 sun4u sparc SUNW,Ultra-5_10

What's wrong?

import Numeric
import Ratio
import System

top 1 = 1
top n = 9*n*top (n-2) + oddfact (n-2)

lfact :: [Integer]
lfact = 1 : zipWith (*) [3,5 .. ] lfact

oddfact :: Integer -> Integer
oddfact n = lfact!!ni
    where 
    ni = nint `div` 2
    nint = fromInteger n

log_two :: Int -> Rational
log_two lim = 2* top n % (3^lim * oddfact n)
    where n = fromIntegral lim

log_tup :: Int -> (Rational, Rational)
log_tup lim =
    -- TODO any chance I can drop the br?  Would it get me more than a digit?
    (l + lo_err, l + hi_err)
    where 
    l = log_two lim
    -- TODO double check these
    lo_err = (2)/(n+1)*(d/(1+c))^(lim+1)
    hi_err = (2)/(n+1)*d^(lim+1)
-- original logs
--     lo_err = (-2)/(n+1)*(d/(1+c))^(lim+1)
--     hi_err = -lo_err
    -- lo_err = (-1)/(n+1)*x^(lim+1)
    -- c = 0
    n = toRational lim
    d = 1%3
    c = d

log_tup_str lim = 
    (floatlo, floathi, diff)
    where 
    (lo, hi) = log_tup lim
    floatlo = floatRat lo lim
    floathi = floatRat hi lim
    diff = floathi - floatlo


floatRat :: Rational -> Int -> Integer
floatRat r lim =
    num*10^lim `div` den
    where
    num = numerator r
    den = denominator r

main :: IO ()
main = 
     do
        args <- System.getArgs
        let lim :: Int
            lim = read (args!!0)
        let (s1, s2, s3) = log_tup_str lim
        let sh1 = show s1
        let l1 = length sh1
        let shd = show s3
        let ld = length shd
        putStrLn (show s1)
        putStrLn (show s2)
        putStrLn (show s3)
        putStr "digits: "
        putStrLn (show (l1-ld))