Numerically consistent Eq, Ord and Hash implementations for various num types.

Example

```rust use std::cmp::Ordering; use std::hash::Hasher; use std::collections::hashmap::DefaultHasher; use numorder::{NumOrd, NumHash};

assert!(NumOrd::numeq(&3u64, &3.0f32)); assert!(NumOrd::numlt(&-4.7f64, &-4i8)); assert!(!NumOrd::num_ge(&-3i8, &1u16));

// 40000000 can be exactly represented in f32, 40000001 cannot // 40000001 becames 40000000.0 in f32 asserteq!(NumOrd::numcmp(&40000000f32, &40000000u32), Ordering::Equal); assertne!(NumOrd::numcmp(&40000001f32, &40000001u32), Ordering::Equal); asserteq!(NumOrd::numpartialcmp(&f32::NAN, &40000_002u32), None);

// same hash values are guaranteed for equal numbers let mut hasher1 = DefaultHasher::new(); 3u64.numhash(&mut hasher1); let mut hasher2 = DefaultHasher::new(); 3.0f32.numhash(&mut hasher2); assert_eq!(hasher1.finish(), hasher2.finish()) ```