Project

General

Profile

Actions

Bug #18187

closed

Float#clamp() returns ArgumentError (comparison of Float with 1 failed)

Added by SouravGoswami (Sourav Goswami) over 2 years ago. Updated over 2 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
[ruby-core:105377]

Description

When I have a Float::NAN as a number, I expect all the method to work properly.

For example, Float::NAN - 1 gives NAN. But Float::NAN.to_i raises FloatDomainError.

But in case of clamp(), Float::NAN.clamp(0, 100) returns ArgumentError (comparison of Float with 1 failed)

This error doesn't explain what's actually wrong. I didn't write the comparison to compare Float with 1. I didn't pass any invalid argument either. This error is a reflection of what's going on in the C level, which shouldn't appear to the user.

If I write a vanilla clamp() in ruby:

Float.define_method(:clamp2) { |min, max| self < min ? min : self > max ? max : self }

In this case, I can call it like this:

> 8.0.clamp2(10, 100)
=> 10
> 80.0.clamp2(10, 100)
=> 80.0
> 800.0.clamp2(10, 100)
=> 100
> Float::NAN.clamp2(10, 100)
=> NaN

As you can see, it just returns NAN. But in case of the built-in clamp, it raises the ArgumentError, even though my arguments are just correct. So this should handle this clamp() correctly, either returning the min value or Float::NAN.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0