2014-07-09 2 views
3

내가 rust-lang.org에 Rust tutorial을 읽고 있어요, 나는 다음과 같은 코드를 건너 온 :마이너스 제로 녹 패턴

use std::f64; 
fn angle(vector: (f64, f64)) -> f64 { 
    let pi = f64::consts::PI; 
    match vector { 
     (0.0, y) if y < 0.0 => 1.5 * pi, 
     (0.0, _) => 0.5 * pi, 
     (x, y) => (y/x).atan() 
    } 
} 

일반적으로 atan2에 내가 -0에 대한 특별한 경우를 볼 기대하고 이와 같은 0, 예를 구현하기위한 경우가 :

atan2(+0, +0) = +0 
atan2(+0, −0) = +π 
atan2(−0, +0) = −0 
atan2(−0, −0) = −π 

나는 자습서 그 예를 포함해야 말하는 게 아니에요. 결국 이것은 match 구조의 데모 일뿐입니다.

0.0-0.0과 일치하는지 궁금합니다. 아니면 둘이 분리 된 값으로 인식 되는가?

답변

4

글쎄, 시도해보고 테스트해볼 수 있습니다! 다음은 플레이 테스트에 대한 링크입니다. http://is.gd/NiS0gF

분명히 0.0-0.0과 일치합니다. 이 코드는 :

fn main() { 
    let x = -0.0f64; 
    match x { 
     0.0f64 => println!("Zero!"), 
     _ => println!("Something else!") 
    } 
} 

플레이 테스트 인쇄를 실행할 때, 그래서 0.0-0.0match 관점에서 같은 일이다 "제로!". 그리고 이것은 매우 자연 스럽습니다. 단,

fn main() { 
    println!("{}", -0.0f64 == 0.0f64); 
} 

also prints "true".

+0

이러한 종류의 비교는 특수화 된 부동 소수점 함수를 사용하는 것이 더 좋습니다. –