fn ieee_parts_to_double(sign : Bool, ieeeExponent : Int, ieeeMantissa : Int64) ->
     Double {
  ((sign.to_int64() << 63) | (ieeeExponent.to_int64() << 52) | ieeeMantissa).reinterpret_as_double()
}

fn init {
  println("Test Basic")
  println(0.0)
  println(-0.0)
  println(1.e0)
  println(-1.e0)
  println(0.0 / 0.0)
  println(1.0 / 0.0)
  println(-1.0 / 0.0)
  println(3.1415926)

  println("Test Switch to Subnormal")
  println(2.2250738585072014e-308)
  println(0x0010000000000000L.reinterpret_as_double())

  println("Test Min and Max")
  println(0x7FEF_FFFF_FFFF_FFFFL.reinterpret_as_double())
  println(1L.reinterpret_as_double())

  println("Test Lots of Trailing Zeros")
  println(2.98023223876953125e-8)

  println("Test Regression")
  println(-2.109808898695963e16)
  println(4.940656e-318)
  println(1.18575755e-316)
  println(2.989102097996e-312)
  println(9.0608011534336e15)
  println(4.708356024711512e18)
  println(9.409340012568248e18)
  println(1.2345678)
  println(1.8531501765868567e21)
  println(-3.347727380279489e33)
  println(1.9430376160308388e16)
  println(-6.9741824662760956e19)
  println(4.3816050601147837e18)

  println("Test Looks Like Pow5")
  println(0x4830F0CF064DD592L.reinterpret_as_double())
  println(0x4840F0CF064DD592L.reinterpret_as_double())
  println(0x4850F0CF064DD592L.reinterpret_as_double())

  println("Test Output Length")
  println(1.0) // already tested in Basic
  println(1.2)
  println(1.23)
  println(1.234)
  println(1.2345)
  println(1.23456)
  println(1.234567)
  println(1.2345678) // already tested in Regression
  println(1.23456789)
  println(1.234567895) // 1.234567890 would be trimmed
  println(1.2345678901)
  println(1.23456789012)
  println(1.234567890123)
  println(1.2345678901234)
  println(1.23456789012345)
  println(1.234567890123456)
  println(1.2345678901234567)
  // Test 32-bit chunking
  println(4.294967294) // 2^32 - 2
  println(4.294967295) // 2^32 - 1
  println(4.294967296) // 2^32
  println(4.294967297) // 2^32 + 1
  println(4.294967298) // 2^32 + 2

  println("Test Min Max Shift")
  let maxMantissa : Int64 = (1L << 53) - 1L
  println(ieee_parts_to_double(false, 4, 0L))
  println(ieee_parts_to_double(false, 6, maxMantissa))
  println(ieee_parts_to_double(false, 41, 0L))
  println(ieee_parts_to_double(false, 40, maxMantissa))
  println(ieee_parts_to_double(false, 1077, 0L))
  println(ieee_parts_to_double(false, 1076, maxMantissa))
  println(ieee_parts_to_double(false, 307, 0L))
  println(ieee_parts_to_double(false, 306, maxMantissa))
  println(ieee_parts_to_double(false, 934, 0x000FA7161A4D6E0CL))

  println("Test Small Integers")
  println(9007199254740991.0) // 2^53-1
  println(9007199254740992.0) // 2^53
  println(1.0e+0)
  println(1.2e+1)
  println(1.23e+2)
  println(1.234e+3)
  println(1.2345e+4)
  println(1.23456e+5)
  println(1.234567e+6)
  println(1.2345678e+7)
  println(1.23456789e+8)
  println(1.23456789e+9)
  println(1.234567895e+9)
  println(1.2345678901e+10)
  println(1.23456789012e+11)
  println(1.234567890123e+12)
  println(1.2345678901234e+13)
  println(1.23456789012345e+14)
  println(1.234567890123456e+15)

  // 10^i
  println(1.0e-15)
  println(1.0e-14)
  println(1.0e-13)
  println(1.0e-12)
  println(1.0e-11)
  println(1.0e-10)
  println(1.0e-9)
  println(1.0e-8)
  println(1.0e-7)
  println(1.0e-6)
  println(1.0e-5)
  println(1.0e-4)
  println(1.0e-3)
  println(1.0e-2)
  println(1.0e-1)
  println(1.0e+0)
  println(1.0e+1)
  println(1.0e+2)
  println(1.0e+3)
  println(1.0e+4)
  println(1.0e+5)
  println(1.0e+6)
  println(1.0e+7)
  println(1.0e+8)
  println(1.0e+9)
  println(1.0e+10)
  println(1.0e+11)
  println(1.0e+12)
  println(1.0e+13)
  println(1.0e+14)
  println(1.0e+15)

  // 10^15 + 10^i
  println(1.0e+15 + 1.0e+0)
  println(1.0e+15 + 1.0e+1)
  println(1.0e+15 + 1.0e+2)
  println(1.0e+15 + 1.0e+3)
  println(1.0e+15 + 1.0e+4)
  println(1.0e+15 + 1.0e+5)
  println(1.0e+15 + 1.0e+6)
  println(1.0e+15 + 1.0e+7)
  println(1.0e+15 + 1.0e+8)
  println(1.0e+15 + 1.0e+9)
  println(1.0e+15 + 1.0e+10)
  println(1.0e+15 + 1.0e+11)
  println(1.0e+15 + 1.0e+12)
  println(1.0e+15 + 1.0e+13)
  println(1.0e+15 + 1.0e+14)

  // Largest power of 2 <= 10^(i+1)
  println(8.0)
  println(64.0)
  println(512.0)
  println(8192.0)
  println(65536.0)
  println(524288.0)
  println(8388608.0)
  println(67108864.0)
  println(536870912.0)
  println(8589934592.0)
  println(68719476736.0)
  println(549755813888.0)
  println(8796093022208.0)
  println(70368744177664.0)
  println(562949953421312.0)
  println(9007199254740992.0)

  // 1000 * (Largest power of 2 <= 10^(i+1))
  println(8.0e+3)
  println(64.0e+3)
  println(512.0e+3)
  println(8192.0e+3)
  println(65536.0e+3)
  println(524288.0e+3)
  println(8388608.0e+3)
  println(67108864.0e+3)
  println(536870912.0e+3)
  println(8589934592.0e+3)
  println(68719476736.0e+3)
  println(549755813888.0e+3)
  println(8796093022208.0e+3)

  println("Test Boundary Conditions")
  // x = 1.0e7
  println(1.0e7)
  // x < 1.0e7
  println(9999999.999999998)
  // x = 1.0e-3
  println(0.001)
  // x < 1.0e-3
  println(0.0009999999999999998)
}
