You are right about range [0,1]. 
I will remove max from hemiDotNormalHalfSky and other 0.5 * dot()