Skip to content

NaN behaviour of is_sign_positive and is_sign_negative is not like for primitive types #3

Closed
@tspiteri

Description

@tspiteri
extern crate half;
use half::f16;
use std::f32;
use std::mem;
fn main() {
    let nan32 = f32::NAN;
    println!(
        "nan32.is_sign_positive() == nan32.is_sign_negative() -> {}",
        nan32.is_sign_positive() == nan32.is_sign_negative()
    );
    let unan32: u32 = unsafe { mem::transmute(nan32) };
    let negated32: f32 = unsafe { mem::transmute(unan32 ^ 0x8000_0000) };
    println!(
        "nan32.is_sign_positive() == negated32.is_sign_positive() -> {}",
        nan32.is_sign_positive() == negated32.is_sign_positive()
    );

    let nan16 = half::consts::NAN;
    println!(
        "nan16.is_sign_positive() == nan16.is_sign_negative() -> {}",
        nan16.is_sign_positive() == nan16.is_sign_negative()
    );
    let unan16: u16 = unsafe { mem::transmute(nan16) };
    let negated16: f16 = unsafe { mem::transmute(unan16 ^ 0x8000) };
    println!(
        "nan16.is_sign_positive() == negated16.is_sign_positive() -> {}",
        nan16.is_sign_positive() == negated16.is_sign_positive()
    );
}

Output:

nan32.is_sign_positive() == nan32.is_sign_negative() -> false
nan32.is_sign_positive() == negated32.is_sign_positive() -> false
nan16.is_sign_positive() == nan16.is_sign_negative() -> true
nan16.is_sign_positive() == negated16.is_sign_positive() -> true

Note that in Rust version 1.20.0, rust-lang/rust#42431, the behaviour of is_sign_positive and is_sign_negative for NaN was updated to conform to IEEE754.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions