@@ -211,7 +211,7 @@ impl Into<f64> for NotNaN<f64> {
211211
212212/// Creates a NotNaN value from a Float.
213213///
214- /// Panics if the provided value is NaN.
214+ /// Panics if the provided value is NaN or the computation results in NaN
215215impl < T : Float > From < T > for NotNaN < T > {
216216 fn from ( v : T ) -> Self {
217217 assert ! ( !v. is_nan( ) ) ;
@@ -239,35 +239,38 @@ impl<T: Float> Add for NotNaN<T> {
239239
240240/// Adds a float directly.
241241///
242- /// Panics if the provided value is NaN.
242+ /// Panics if the provided value is NaN or the computation results in NaN
243243impl < T : Float > Add < T > for NotNaN < T > {
244244 type Output = Self ;
245245
246246 fn add ( self , other : T ) -> Self {
247247 assert ! ( !other. is_nan( ) ) ;
248- NotNaN ( self . 0 + other)
248+ NotNaN :: new ( self . 0 + other) . expect ( "Addition resulted in NaN" )
249249 }
250250}
251251
252252impl AddAssign for NotNaN < f64 > {
253253 fn add_assign ( & mut self , other : Self ) {
254254 self . 0 += other. 0 ;
255+ assert ! ( !self . 0 . is_nan( ) , "Addition resulted in NaN" )
255256 }
256257}
257258
258259impl AddAssign for NotNaN < f32 > {
259260 fn add_assign ( & mut self , other : Self ) {
260261 self . 0 += other. 0 ;
262+ assert ! ( !self . 0 . is_nan( ) , "Addition resulted in NaN" )
261263 }
262264}
263265
264266/// Adds a float directly.
265267///
266- /// Panics if the provided value is NaN.
268+ /// Panics if the provided value is NaN or the computation results in NaN
267269impl AddAssign < f64 > for NotNaN < f64 > {
268270 fn add_assign ( & mut self , other : f64 ) {
269271 assert ! ( !other. is_nan( ) ) ;
270272 self . 0 += other;
273+ assert ! ( !self . 0 . is_nan( ) , "Addition resulted in NaN" )
271274 }
272275}
273276
@@ -278,90 +281,97 @@ impl AddAssign<f32> for NotNaN<f32> {
278281 fn add_assign ( & mut self , other : f32 ) {
279282 assert ! ( !other. is_nan( ) ) ;
280283 self . 0 += other;
284+ assert ! ( !self . 0 . is_nan( ) , "Addition resulted in NaN" )
281285 }
282286}
283287
284288impl < T : Float > Sub for NotNaN < T > {
285289 type Output = Self ;
286290
287291 fn sub ( self , other : Self ) -> Self {
288- NotNaN ( self . 0 - other. 0 )
292+ NotNaN :: new ( self . 0 - other. 0 ) . expect ( "Subtraction resulted in NaN" )
289293 }
290294}
291295
292296/// Subtracts a float directly.
293297///
294- /// Panics if the provided value is NaN.
298+ /// Panics if the provided value is NaN or the computation results in NaN
295299impl < T : Float > Sub < T > for NotNaN < T > {
296300 type Output = Self ;
297301
298302 fn sub ( self , other : T ) -> Self {
299303 assert ! ( !other. is_nan( ) ) ;
300- NotNaN ( self . 0 - other)
304+ NotNaN :: new ( self . 0 - other) . expect ( "Subtraction resulted in NaN" )
301305 }
302306}
303307
304308impl SubAssign for NotNaN < f64 > {
305309 fn sub_assign ( & mut self , other : Self ) {
306310 self . 0 -= other. 0 ;
311+ assert ! ( !self . 0 . is_nan( ) , "Subtraction resulted in NaN" )
307312 }
308313}
309314
310315impl SubAssign for NotNaN < f32 > {
311316 fn sub_assign ( & mut self , other : Self ) {
312317 self . 0 -= other. 0 ;
318+ assert ! ( !self . 0 . is_nan( ) , "Subtraction resulted in NaN" )
313319 }
314320}
315321
316322/// Subtracts a float directly.
317323///
318- /// Panics if the provided value is NaN.
324+ /// Panics if the provided value is NaN or the computation results in NaN
319325impl SubAssign < f64 > for NotNaN < f64 > {
320326 fn sub_assign ( & mut self , other : f64 ) {
321327 assert ! ( !other. is_nan( ) ) ;
322328 self . 0 -= other;
329+ assert ! ( !self . 0 . is_nan( ) , "Subtraction resulted in NaN" )
323330 }
324331}
325332
326333/// Subtracts a float directly.
327334///
328- /// Panics if the provided value is NaN.
335+ /// Panics if the provided value is NaN or the computation results in NaN
329336impl SubAssign < f32 > for NotNaN < f32 > {
330337 fn sub_assign ( & mut self , other : f32 ) {
331338 assert ! ( !other. is_nan( ) ) ;
332339 self . 0 -= other;
340+ assert ! ( !self . 0 . is_nan( ) , "Subtraction resulted in NaN" )
333341 }
334342}
335343
336344impl < T : Float > Mul for NotNaN < T > {
337345 type Output = Self ;
338346
339347 fn mul ( self , other : Self ) -> Self {
340- NotNaN ( self . 0 * other. 0 )
348+ NotNaN :: new ( self . 0 * other. 0 ) . expect ( "Multiplication resulted in NaN" )
341349 }
342350}
343351
344352/// Multiplies a float directly.
345353///
346- /// Panics if the provided value is NaN.
354+ /// Panics if the provided value is NaN or the computation results in NaN
347355impl < T : Float > Mul < T > for NotNaN < T > {
348356 type Output = Self ;
349357
350358 fn mul ( self , other : T ) -> Self {
351359 assert ! ( !other. is_nan( ) ) ;
352- NotNaN ( self . 0 * other)
360+ NotNaN :: new ( self . 0 * other) . expect ( "Multiplication resulted in NaN" )
353361 }
354362}
355363
356364impl MulAssign for NotNaN < f64 > {
357365 fn mul_assign ( & mut self , other : Self ) {
358366 self . 0 *= other. 0 ;
367+ assert ! ( !self . 0 . is_nan( ) , "Multiplication resulted in NaN" )
359368 }
360369}
361370
362371impl MulAssign for NotNaN < f32 > {
363372 fn mul_assign ( & mut self , other : Self ) {
364373 self . 0 *= other. 0 ;
374+ assert ! ( !self . 0 . is_nan( ) , "Multiplication resulted in NaN" )
365375 }
366376}
367377
@@ -377,123 +387,132 @@ impl MulAssign<f64> for NotNaN<f64> {
377387
378388/// Multiplies a float directly.
379389///
380- /// Panics if the provided value is NaN.
390+ /// Panics if the provided value is NaN or the computation results in NaN
381391impl MulAssign < f32 > for NotNaN < f32 > {
382392 fn mul_assign ( & mut self , other : f32 ) {
383393 assert ! ( !other. is_nan( ) ) ;
384394 self . 0 *= other;
395+ assert ! ( !self . 0 . is_nan( ) , "Multiplication resulted in NaN" )
385396 }
386397}
387398
388399impl < T : Float > Div for NotNaN < T > {
389400 type Output = Self ;
390401
391402 fn div ( self , other : Self ) -> Self {
392- NotNaN ( self . 0 / other. 0 )
403+ NotNaN :: new ( self . 0 / other. 0 ) . expect ( "Division resulted in NaN" )
393404 }
394405}
395406
396407/// Divides a float directly.
397408///
398- /// Panics if the provided value is NaN.
409+ /// Panics if the provided value is NaN or the computation results in NaN
399410impl < T : Float > Div < T > for NotNaN < T > {
400411 type Output = Self ;
401412
402413 fn div ( self , other : T ) -> Self {
403414 assert ! ( !other. is_nan( ) ) ;
404- NotNaN ( self . 0 / other)
415+ NotNaN :: new ( self . 0 / other) . expect ( "Division resulted in NaN" )
405416 }
406417}
407418
408419impl DivAssign for NotNaN < f64 > {
409420 fn div_assign ( & mut self , other : Self ) {
410421 self . 0 /= other. 0 ;
422+ assert ! ( !self . 0 . is_nan( ) , "Division resulted in NaN" )
411423 }
412424}
413425
414426impl DivAssign for NotNaN < f32 > {
415427 fn div_assign ( & mut self , other : Self ) {
416428 self . 0 /= other. 0 ;
429+ assert ! ( !self . 0 . is_nan( ) , "Division resulted in NaN" )
417430 }
418431}
419432
420433/// Divides a float directly.
421434///
422- /// Panics if the provided value is NaN.
435+ /// Panics if the provided value is NaN or the computation results in NaN
423436impl DivAssign < f64 > for NotNaN < f64 > {
424437 fn div_assign ( & mut self , other : f64 ) {
425438 assert ! ( !other. is_nan( ) ) ;
426439 self . 0 /= other;
440+ assert ! ( !self . 0 . is_nan( ) , "Division resulted in NaN" )
427441 }
428442}
429443
430444/// Divides a float directly.
431445///
432- /// Panics if the provided value is NaN.
446+ /// Panics if the provided value is NaN or the computation results in NaN
433447impl DivAssign < f32 > for NotNaN < f32 > {
434448 fn div_assign ( & mut self , other : f32 ) {
435449 assert ! ( !other. is_nan( ) ) ;
436450 self . 0 /= other;
451+ assert ! ( !self . 0 . is_nan( ) , "Division resulted in NaN" )
437452 }
438453}
439454
440455impl < T : Float > Rem for NotNaN < T > {
441456 type Output = Self ;
442457
443458 fn rem ( self , other : Self ) -> Self {
444- NotNaN ( self . 0 % other. 0 )
459+ NotNaN :: new ( self . 0 % other. 0 ) . expect ( "Rem resulted in NaN" )
445460 }
446461}
447462
448463/// Calculates `%` with a float directly.
449464///
450- /// Panics if the provided value is NaN.
465+ /// Panics if the provided value is NaN or the computation results in NaN
451466impl < T : Float > Rem < T > for NotNaN < T > {
452467 type Output = Self ;
453468
454469 fn rem ( self , other : T ) -> Self {
455470 assert ! ( !other. is_nan( ) ) ;
456- NotNaN ( self . 0 % other)
471+ NotNaN :: new ( self . 0 % other) . expect ( "Rem resulted in NaN" )
457472 }
458473}
459474
460475impl RemAssign for NotNaN < f64 > {
461476 fn rem_assign ( & mut self , other : Self ) {
462477 self . 0 %= other. 0 ;
478+ assert ! ( !self . 0 . is_nan( ) , "Rem resulted in NaN" )
463479 }
464480}
465481
466482impl RemAssign for NotNaN < f32 > {
467483 fn rem_assign ( & mut self , other : Self ) {
468484 self . 0 %= other. 0 ;
485+ assert ! ( !self . 0 . is_nan( ) , "Rem resulted in NaN" )
469486 }
470487}
471488
472489/// Calculates `%=` with a float directly.
473490///
474- /// Panics if the provided value is NaN.
491+ /// Panics if the provided value is NaN or the computation results in NaN
475492impl RemAssign < f64 > for NotNaN < f64 > {
476493 fn rem_assign ( & mut self , other : f64 ) {
477494 assert ! ( !other. is_nan( ) ) ;
478495 self . 0 %= other;
496+ assert ! ( !self . 0 . is_nan( ) , "Rem resulted in NaN" )
479497 }
480498}
481499
482500/// Calculates `%=` with a float directly.
483501///
484- /// Panics if the provided value is NaN.
502+ /// Panics if the provided value is NaN or the computation results in NaN
485503impl RemAssign < f32 > for NotNaN < f32 > {
486504 fn rem_assign ( & mut self , other : f32 ) {
487505 assert ! ( !other. is_nan( ) ) ;
488506 self . 0 %= other;
507+ assert ! ( !self . 0 . is_nan( ) , "Rem resulted in NaN" )
489508 }
490509}
491510
492511impl < T : Float > Neg for NotNaN < T > {
493512 type Output = Self ;
494513
495514 fn neg ( self ) -> Self {
496- NotNaN ( -self . 0 )
515+ NotNaN :: new ( -self . 0 ) . expect ( "Negation resulted in NaN" )
497516 }
498517}
499518
0 commit comments