Skip to content

float.IsNegativeInfinity() and double.IsNegativeInfinity() do not correctly identify negative infinity  #1397

Closed
nanoframework/nf-interpreter
#3088
@CoryCharlton

Description

@CoryCharlton

Library/API/IoT binding

PAL?

Visual Studio version

No response

.NET nanoFramework extension version

No response

Target name(s)

No response

Firmware version

No response

Device capabilities

No response

Description

I noticed several unit tests in System.Math we failing (before I touched it, I swear ;-)). The root cause appears to be that IsNegativeInfinity returns false even though the parameter is negative infinity.

The code in System::Double::IsNegativeInfinity looks correct and I reproduced the logic in an online compiler https://godbolt.org/z/5PWKhhf81 (although not everything is the same)

Given that the code is correct, and the debugger shows the correct value before executing the method, I have to assume something is changing the parameter in between the caller and the callee 🤷

How to reproduce

Run the sample code (see screenshot below for results)

Expected behaviour

IsNegativeInfinity() returns true when value is negative infinity.

Screenshots

image

Sample project or code

double d_nan = 0.0 / 0.0;
double d_pos_inf = (3.0 / 0.0);
double d_neg_inf = (-3.0 / 0.0);

Console.WriteLine($"Expect d_nan={d_nan} - {double.IsNaN(d_nan)}, d_pos_inf={d_pos_inf} - {double.IsPositiveInfinity(d_pos_inf)}, d_neg_inf={d_neg_inf} - {double.IsNegativeInfinity(d_neg_inf)}");

float f_nan = 0.0f / 0.0f;
float f_pos_inf = (3.0f / 0.0f);
float f_neg_inf = (-3.0f / 0.0f);

Console.WriteLine($"Expect f_nan={f_nan} - {float.IsNaN(f_nan)}, f_pos_inf={f_pos_inf} - {float.IsPositiveInfinity(f_pos_inf)}, f_neg_inf={f_neg_inf} - {float.IsNegativeInfinity(f_neg_inf)}");

Aditional information

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions