Project

General

Profile

Actions

Bug #17205

closed

Misleading error message when comparing NaN with numbers in array

Added by timhwang21 (Tim Hwang) over 3 years ago. Updated over 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.0dev (2020-09-30T11:43:19Z master 65e8a29389) [x86_64-darwin19]
[ruby-core:100236]

Description

The closest issue I could find is this: https://bugs.ruby-lang.org/issues/10424

There is quite a lot of inconsistency when dealing with arrays containing NaN, dependent on 1) if comparing against an integer or a float, 2) order of comparison. The one that stands out to me as "least correct" is the last one ([Float::NAN, 1.0].min) which raises TypeError (no implicit conversion from nil to integer).

# .sort
[1, Float::NAN].sort
# Most sensible error message
# ArgumentError (comparison of Integer with NaN failed)

[1.0, Float::NAN].sort
# Somewhat sensible error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1].sort
# Somewhat sensible error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1.0].sort
# Somewhat sensible error message
# TypeError (no implicit conversion from nil to integer)

# .min
[1, Float::NAN].min
# Most sensible error message
# ArgumentError (comparison of Float with 1 failed)

[1.0, Float::NAN].min
# Somewhat sensible error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1].min
# Most sensible error message
# ArgumentError (comparison of Integer with NaN failed)

[Float::NAN, 1.0].min
# Very misleading error message
# TypeError (no implicit conversion from nil to integer)

Updated by timhwang21 (Tim Hwang) over 3 years ago

The closest issue I could find is this: https://bugs.ruby-lang.org/issues/10424

There is quite a lot of inconsistency when dealing with arrays containing NaN, dependent on 1) if comparing against an integer or a float, 2) order of comparison. The one that stands out to me as "least correct" is the last one ([Float::NAN, 1.0].min) which raises TypeError (no implicit conversion from nil to integer).

# .sort
[1, Float::NAN].sort
# Most sensible error message
# ArgumentError (comparison of Integer with NaN failed)

[1.0, Float::NAN].sort
# Confusing error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1].sort
# Confusing error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1.0].sort
# Confusing error message
# TypeError (no implicit conversion from nil to integer)

# .min
[1, Float::NAN].min
# Most sensible error message
# ArgumentError (comparison of Float with 1 failed)

[1.0, Float::NAN].min
# Confusing error message
# TypeError (no implicit conversion from nil to integer)

[Float::NAN, 1].min
# Most sensible error message
# ArgumentError (comparison of Integer with NaN failed)

[Float::NAN, 1.0].min
# Confusing error message
# TypeError (no implicit conversion from nil to integer)

Updated by shyouhei (Shyouhei Urabe) over 3 years ago

JFYI the reason why "implicit conversion from nil to integer" happens:

zsh % LC_ALL=C gdb --args ./miniruby -e'[Float::NAN, 1.0].min'
GNU gdb (Ubuntu 8.2-0ubuntu1~18.04) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./miniruby...done.
(gdb) break rb_raise
Breakpoint 1 at 0xc4520: file error.c, line 2824.
(gdb) run
Starting program: ./miniruby -e\[Float::NAN,\ 1.0\].min
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, rb_raise (exc=93824999143280, fmt=fmt@entry=0x55555583a928 "no implicit conversion from nil to integer") at error.c:2824
2824    {
(gdb) bt
#0  rb_raise (exc=93824999143280, fmt=fmt@entry=0x55555583a928 "no implicit conversion from nil to integer") at error.c:2824
#1  0x00005555556c9421 in rb_num2long (val=<optimized out>) at numeric.c:2885
#2  0x00005555556ca28e in rb_num2int (val=<optimized out>) at numeric.c:2989
#3  rb_num2int_inline (x=<optimized out>) at include/ruby/internal/arithmetic/int.h:95
#4  rb_float_cmp (x=18410715276690587650, y=<optimized out>) at numeric.c:1521
#5  0x0000555555803fa9 in vm_opt_newarray_min (ptr=<optimized out>, num=<optimized out>) at vm_method.c:2293
#6  vm_exec_core (ec=0x555555beb770, initial=93824995273000) at insns.def:863
#7  0x00005555557f4f90 in rb_vm_exec (ec=0x555555b3f5b0, mjit_enable_p=1) at vm.c:1983
#8  0x000055555561b940 in rb_ec_exec_node (ec=ec@entry=0x555555b3f5b0, n=n@entry=0x555555b63dc0) at eval.c:308
#9  0x000055555561fef7 in ruby_run_node (n=0x555555b63dc0) at eval.c:366
#10 0x000055555558165f in main (argc=<optimized out>, argv=<optimized out>) at main.c:50
(gdb)

I guess this is a bug of rb_float_cmp().

Actions #3

Updated by nobu (Nobuyoshi Nakada) over 3 years ago

  • Status changed from Open to Closed

Applied in changeset git|89ca842dcce7f05942e2d7be3edc404c9556cafd.


Ensure that the comparison succeeded [Bug #17205]

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0