[julia-users] Test approximate equality of Float16 arrays

2014-12-14 Thread Steve Cordwell
Hi,

I have been playing around with Float16 arrays and I haven't been able to 
figure out what is going on in this case, and whether it is expected 
behaviour. According to the Wikipedia article half precision floating point 
numbers are used for data storage and not for computations.

I was surprised to find that 

 using Base.Test
 @test_approx_eq rand(Float16, 10,10) rand(Float16, 10, 10)

gave no error, or even

 @test_approx_eq 1000rand(Float16, 10,10) 1000rand(Float16, 10, 10)

gave no errors. Using the testing modules method of working out the 
tolerance for comparison of the arrays gives

 array_eps(a) = eps(float(maximum(x-(isfinite(x) ? abs(x) : 
oftype(x,NaN)), a)))
 va=rand(10,10,3); vb=rand(Float16, 10,10,3); 
1E4*length(va)*max(array_eps(va), array_eps(vb))
1464.84375

So a tolerance of over 1000. Is this to be expected with Float16, or not?


Re: [julia-users] Test approximate equality of Float16 arrays

2014-12-14 Thread John Myles White
That seems like a bug. Running something like,

x = rand(Float16, 10, 10)
y = rand(Float16, 10, 10)
all(abs(x - y) . eps(max(maximum(x), maximum(y

Gives me a true more than 80% of the time.

 -- John

On Dec 14, 2014, at 3:26 AM, Steve Cordwell steve.cordw...@gmail.com wrote:

 Hi,
 
 I have been playing around with Float16 arrays and I haven't been able to 
 figure out what is going on in this case, and whether it is expected 
 behaviour. According to the Wikipedia article half precision floating point 
 numbers are used for data storage and not for computations.
 
 I was surprised to find that 
 
  using Base.Test
  @test_approx_eq rand(Float16, 10,10) rand(Float16, 10, 10)
 
 gave no error, or even
 
  @test_approx_eq 1000rand(Float16, 10,10) 1000rand(Float16, 10, 10)
 
 gave no errors. Using the testing modules method of working out the tolerance 
 for comparison of the arrays gives
 
  array_eps(a) = eps(float(maximum(x-(isfinite(x) ? abs(x) : oftype(x,NaN)), 
  a)))
  va=rand(10,10,3); vb=rand(Float16, 10,10,3); 
  1E4*length(va)*max(array_eps(va), array_eps(vb))
 1464.84375
 
 So a tolerance of over 1000. Is this to be expected with Float16, or not?