| 
									
										
										
										
											2010-01-13 04:20:16 -05:00
										 |  |  | ! Copyright (C) 2004, 2010 Slava Pestov, Joe Groff. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-01-13 04:20:16 -05:00
										 |  |  | USING: kernel math math.private math.order ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: math.floats.private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  | : float-unordered? ( x y -- ? ) [ fp-nan? ] either? ;
 | 
					
						
							| 
									
										
										
										
											2009-08-28 20:02:59 -04:00
										 |  |  | : float-min ( x y -- z ) [ float< ] most ; foldable
 | 
					
						
							|  |  |  | : float-max ( x y -- z ) [ float> ] most ; foldable
 | 
					
						
							| 
									
										
										
										
											2009-08-28 06:21:16 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: float >fixnum float>fixnum ; inline
 | 
					
						
							|  |  |  | M: float >bignum float>bignum ; inline
 | 
					
						
							|  |  |  | M: float >float ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: float hashcode* nip float>bits ; inline
 | 
					
						
							|  |  |  | M: float equal? over float? [ float= ] [ 2drop f ] if ; inline
 | 
					
						
							|  |  |  | M: float number= float= ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-02 03:02:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 23:20:13 -04:00
										 |  |  | M: float <  float< ; inline
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: float <= float<= ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-12 23:20:13 -04:00
										 |  |  | M: float >  float> ; inline
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: float >= float>= ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 23:20:13 -04:00
										 |  |  | M: float unordered? float-unordered? ; inline
 | 
					
						
							|  |  |  | M: float u<  float-u< ; inline
 | 
					
						
							|  |  |  | M: float u<= float-u<= ; inline
 | 
					
						
							|  |  |  | M: float u>  float-u> ; inline
 | 
					
						
							|  |  |  | M: float u>= float-u>= ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 04:20:16 -05:00
										 |  |  | M: float min over float? [ float-min ] [ call-next-method ] if ; inline
 | 
					
						
							|  |  |  | M: float max over float? [ float-max ] [ call-next-method ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: float + float+ ; inline
 | 
					
						
							|  |  |  | M: float - float- ; inline
 | 
					
						
							|  |  |  | M: float * float* ; inline
 | 
					
						
							|  |  |  | M: float / float/f ; inline
 | 
					
						
							|  |  |  | M: float /f float/f ; inline
 | 
					
						
							|  |  |  | M: float /i float/f >integer ; inline
 | 
					
						
							| 
									
										
										
										
											2008-04-28 22:26:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-17 23:32:21 -04:00
										 |  |  | M: real abs dup 0 < [ neg ] when ; inline
 | 
					
						
							| 
									
										
										
										
											2009-08-20 04:55:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: float fp-special? | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     double>bits -52 shift 0x7ff [ bitand ] keep = ; inline
 | 
					
						
							| 
									
										
										
										
											2009-08-20 04:55:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: float fp-nan-payload | 
					
						
							|  |  |  |     double>bits 52 2^ 1 - bitand ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: float fp-nan? | 
					
						
							| 
									
										
										
										
											2009-09-10 23:45:18 -04:00
										 |  |  |     dup float= not ;
 | 
					
						
							| 
									
										
										
										
											2009-08-20 04:55:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: float fp-qnan? | 
					
						
							|  |  |  |     dup fp-nan? [ fp-nan-payload 51 2^ bitand zero? not ] [ drop f ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: float fp-snan? | 
					
						
							|  |  |  |     dup fp-nan? [ fp-nan-payload 51 2^ bitand zero? ] [ drop f ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: float fp-infinity? | 
					
						
							|  |  |  |     dup fp-special? [ fp-nan-payload zero? ] [ drop f ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 17:24:07 -04:00
										 |  |  | M: float next-float | 
					
						
							| 
									
										
										
										
											2009-08-20 04:55:19 -04:00
										 |  |  |     double>bits
 | 
					
						
							|  |  |  |     dup -0.0 double>bits > [ 1 - bits>double ] [ ! negative non-zero | 
					
						
							|  |  |  |         dup -0.0 double>bits = [ drop 0.0 ] [ ! negative zero | 
					
						
							|  |  |  |             1 + bits>double ! positive | 
					
						
							|  |  |  |         ] if
 | 
					
						
							|  |  |  |     ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 17:24:07 -04:00
										 |  |  | M: float prev-float | 
					
						
							| 
									
										
										
										
											2009-08-20 04:55:19 -04:00
										 |  |  |     double>bits
 | 
					
						
							|  |  |  |     dup -0.0 double>bits >= [ 1 + bits>double ] [ ! negative | 
					
						
							|  |  |  |         dup 0.0 double>bits = [ drop -0.0 ] [ ! positive zero | 
					
						
							|  |  |  |             1 - bits>double ! positive non-zero | 
					
						
							|  |  |  |         ] if
 | 
					
						
							|  |  |  |     ] if ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-12 17:24:07 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: float fp-sign double>bits 63 bit? ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-23 22:51:05 -05:00
										 |  |  | M: float neg? fp-sign ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 17:24:07 -04:00
										 |  |  | M: float abs double>bits 63 2^ bitnot bitand bits>double ; inline
 |