@@ -24,6 +24,8 @@ use core::ops::{
2424use  core:: str:: FromStr ; 
2525
2626pub  use  num_traits:: float:: FloatCore ; 
27+ #[ cfg( any( feature = "std" ,  feature = "libm" ) ) ]  
28+ use  num_traits:: real:: Real ; 
2729use  num_traits:: { 
2830    AsPrimitive ,  Bounded ,  FloatConst ,  FromPrimitive ,  Num ,  NumCast ,  One ,  Signed ,  ToPrimitive ,  Zero , 
2931} ; 
@@ -1957,6 +1959,170 @@ impl<T: FloatCore> NumCast for NotNan<T> {
19571959    } 
19581960} 
19591961
1962+ #[ cfg( any( feature = "std" ,  feature = "libm" ) ) ]  
1963+ impl < T :  Real  + FloatCore >  Real  for  NotNan < T >  { 
1964+     fn  min_value ( )  -> Self  { 
1965+         NotNan ( <T  as  Real >:: min_value ( ) ) 
1966+     } 
1967+     fn  min_positive_value ( )  -> Self  { 
1968+         NotNan ( <T  as  Real >:: min_positive_value ( ) ) 
1969+     } 
1970+     fn  epsilon ( )  -> Self  { 
1971+         NotNan ( Real :: epsilon ( ) ) 
1972+     } 
1973+     fn  max_value ( )  -> Self  { 
1974+         NotNan ( <T  as  Real >:: max_value ( ) ) 
1975+     } 
1976+     fn  floor ( self )  -> Self  { 
1977+         NotNan ( Real :: floor ( self . 0 ) ) 
1978+     } 
1979+     fn  ceil ( self )  -> Self  { 
1980+         NotNan ( Real :: ceil ( self . 0 ) ) 
1981+     } 
1982+     fn  round ( self )  -> Self  { 
1983+         NotNan ( Real :: round ( self . 0 ) ) 
1984+     } 
1985+     fn  trunc ( self )  -> Self  { 
1986+         NotNan ( Real :: trunc ( self . 0 ) ) 
1987+     } 
1988+     fn  fract ( self )  -> Self  { 
1989+         NotNan ( Real :: fract ( self . 0 ) ) 
1990+     } 
1991+     fn  abs ( self )  -> Self  { 
1992+         NotNan ( Real :: abs ( self . 0 ) ) 
1993+     } 
1994+     fn  signum ( self )  -> Self  { 
1995+         NotNan ( Real :: signum ( self . 0 ) ) 
1996+     } 
1997+     fn  is_sign_positive ( self )  -> bool  { 
1998+         Real :: is_sign_positive ( self . 0 ) 
1999+     } 
2000+     fn  is_sign_negative ( self )  -> bool  { 
2001+         Real :: is_sign_negative ( self . 0 ) 
2002+     } 
2003+     fn  mul_add ( self ,  a :  Self ,  b :  Self )  -> Self  { 
2004+         NotNan ( self . 0 . mul_add ( a. 0 ,  b. 0 ) ) 
2005+     } 
2006+     fn  recip ( self )  -> Self  { 
2007+         NotNan ( Real :: recip ( self . 0 ) ) 
2008+     } 
2009+     fn  powi ( self ,  n :  i32 )  -> Self  { 
2010+         NotNan ( Real :: powi ( self . 0 ,  n) ) 
2011+     } 
2012+     fn  powf ( self ,  n :  Self )  -> Self  { 
2013+         // Panics if  self < 0 and n is not an integer 
2014+         NotNan :: new ( self . 0 . powf ( n. 0 ) ) . expect ( "Power resulted in NaN" ) 
2015+     } 
2016+     fn  sqrt ( self )  -> Self  { 
2017+         // Panics if self < 0 
2018+         NotNan :: new ( self . 0 . sqrt ( ) ) . expect ( "Square root resulted in NaN" ) 
2019+     } 
2020+     fn  exp ( self )  -> Self  { 
2021+         NotNan ( self . 0 . exp ( ) ) 
2022+     } 
2023+     fn  exp2 ( self )  -> Self  { 
2024+         NotNan ( self . 0 . exp2 ( ) ) 
2025+     } 
2026+     fn  ln ( self )  -> Self  { 
2027+         // Panics if self <= 0 
2028+         NotNan :: new ( self . 0 . ln ( ) ) . expect ( "Natural logarithm resulted in NaN" ) 
2029+     } 
2030+     fn  log ( self ,  base :  Self )  -> Self  { 
2031+         // Panics if self <= 0 or base <= 0 
2032+         NotNan :: new ( self . 0 . log ( base. 0 ) ) . expect ( "Logarithm resulted in NaN" ) 
2033+     } 
2034+     fn  log2 ( self )  -> Self  { 
2035+         // Panics if self <= 0 
2036+         NotNan :: new ( self . 0 . log2 ( ) ) . expect ( "Logarithm resulted in NaN" ) 
2037+     } 
2038+     fn  log10 ( self )  -> Self  { 
2039+         // Panics if self <= 0 
2040+         NotNan :: new ( self . 0 . log10 ( ) ) . expect ( "Logarithm resulted in NaN" ) 
2041+     } 
2042+     fn  to_degrees ( self )  -> Self  { 
2043+         NotNan ( Real :: to_degrees ( self . 0 ) ) 
2044+     } 
2045+     fn  to_radians ( self )  -> Self  { 
2046+         NotNan ( Real :: to_radians ( self . 0 ) ) 
2047+     } 
2048+     fn  max ( self ,  other :  Self )  -> Self  { 
2049+         NotNan ( Real :: max ( self . 0 ,  other. 0 ) ) 
2050+     } 
2051+     fn  min ( self ,  other :  Self )  -> Self  { 
2052+         NotNan ( Real :: min ( self . 0 ,  other. 0 ) ) 
2053+     } 
2054+     fn  abs_sub ( self ,  other :  Self )  -> Self  { 
2055+         NotNan ( self . 0 . abs_sub ( other. 0 ) ) 
2056+     } 
2057+     fn  cbrt ( self )  -> Self  { 
2058+         NotNan ( self . 0 . cbrt ( ) ) 
2059+     } 
2060+     fn  hypot ( self ,  other :  Self )  -> Self  { 
2061+         NotNan ( self . 0 . hypot ( other. 0 ) ) 
2062+     } 
2063+     fn  sin ( self )  -> Self  { 
2064+         // Panics if self is +/-infinity 
2065+         NotNan :: new ( self . 0 . sin ( ) ) . expect ( "Sine resulted in NaN" ) 
2066+     } 
2067+     fn  cos ( self )  -> Self  { 
2068+         // Panics if self is +/-infinity 
2069+         NotNan :: new ( self . 0 . cos ( ) ) . expect ( "Cosine resulted in NaN" ) 
2070+     } 
2071+     fn  tan ( self )  -> Self  { 
2072+         // Panics if self is +/-infinity or self == pi/2 + k*pi 
2073+         NotNan :: new ( self . 0 . tan ( ) ) . expect ( "Tangent resulted in NaN" ) 
2074+     } 
2075+     fn  asin ( self )  -> Self  { 
2076+         // Panics if self < -1.0 or self > 1.0 
2077+         NotNan :: new ( self . 0 . asin ( ) ) . expect ( "Arcsine resulted in NaN" ) 
2078+     } 
2079+     fn  acos ( self )  -> Self  { 
2080+         // Panics if self < -1.0 or self > 1.0 
2081+         NotNan :: new ( self . 0 . acos ( ) ) . expect ( "Arccosine resulted in NaN" ) 
2082+     } 
2083+     fn  atan ( self )  -> Self  { 
2084+         NotNan ( self . 0 . atan ( ) ) 
2085+     } 
2086+     fn  atan2 ( self ,  other :  Self )  -> Self  { 
2087+         NotNan ( self . 0 . atan2 ( other. 0 ) ) 
2088+     } 
2089+     fn  sin_cos ( self )  -> ( Self ,  Self )  { 
2090+         // Panics if self is +/-infinity 
2091+         let  ( a,  b)  = self . 0 . sin_cos ( ) ; 
2092+         ( 
2093+             NotNan :: new ( a) . expect ( "Sine resulted in NaN" ) , 
2094+             NotNan :: new ( b) . expect ( "Cosine resulted in NaN" ) , 
2095+         ) 
2096+     } 
2097+     fn  exp_m1 ( self )  -> Self  { 
2098+         NotNan ( self . 0 . exp_m1 ( ) ) 
2099+     } 
2100+     fn  ln_1p ( self )  -> Self  { 
2101+         // Panics if self <= -1.0 
2102+         NotNan :: new ( self . 0 . ln_1p ( ) ) . expect ( "Natural logarithm resulted in NaN" ) 
2103+     } 
2104+     fn  sinh ( self )  -> Self  { 
2105+         NotNan ( self . 0 . sinh ( ) ) 
2106+     } 
2107+     fn  cosh ( self )  -> Self  { 
2108+         NotNan ( self . 0 . cosh ( ) ) 
2109+     } 
2110+     fn  tanh ( self )  -> Self  { 
2111+         NotNan ( self . 0 . tanh ( ) ) 
2112+     } 
2113+     fn  asinh ( self )  -> Self  { 
2114+         NotNan ( self . 0 . asinh ( ) ) 
2115+     } 
2116+     fn  acosh ( self )  -> Self  { 
2117+         // Panics if self < 1.0 
2118+         NotNan :: new ( self . 0 . acosh ( ) ) . expect ( "Arccosh resulted in NaN" ) 
2119+     } 
2120+     fn  atanh ( self )  -> Self  { 
2121+         // Panics if self < -1.0 or self > 1.0 
2122+         NotNan :: new ( self . 0 . atanh ( ) ) . expect ( "Arctanh resulted in NaN" ) 
2123+     } 
2124+ } 
2125+ 
19602126macro_rules!  impl_float_const_method { 
19612127    ( $wrapper: expr,  $method: ident)  => { 
19622128        #[ allow( non_snake_case) ] 
0 commit comments