@@ -737,4 +737,48 @@ number hp_sinh(number x){
737737
738738number hp_cosh ( number x ) {
739739 return shift_right ( add ( hp_exp ( x ) , hp_exp ( neg ( x ) ) ) , 1 ) ;
740+ }
741+ int hp_compare ( number a , number b ) {
742+ bool a_zero = is_zero ( a ) ;
743+ bool b_zero = is_zero ( b ) ;
744+ if ( a_zero && b_zero ) return 0 ;
745+
746+ if ( a . sign != b . sign ) {
747+ return ( a . sign == 1 ) ? 1 : - 1 ;
748+ }
749+
750+ int abs_cmp = compare_abs ( a , b ) ;
751+
752+ return abs_cmp * a . sign ;
753+ }
754+ number hp_step ( number edge , number x ) {
755+ if ( hp_compare ( x , edge ) >= 0 ) {
756+ return number_one ( ) ;
757+ }
758+ return null_number ( ) ;
759+ }
760+
761+ number hp_mix ( number x , number y , number a ) {
762+ number diff = sub ( y , x ) ;
763+ number scaled_diff = mult ( a , diff ) ;
764+ return add ( x , scaled_diff ) ;
765+ }
766+
767+ number hp_smoothstep ( number edge0 , number edge1 , number x ) {
768+ number t = div ( sub ( x , edge0 ) , sub ( edge1 , edge0 ) ) ;
769+
770+ number zero = null_number ( ) ;
771+ number one = number_one ( ) ;
772+ if ( hp_compare ( t , zero ) < 0 ) t = zero ;
773+ if ( hp_compare ( t , one ) > 0 ) t = one ;
774+
775+ number t_sq = mult ( t , t ) ;
776+
777+ number two = add ( one , one ) ;
778+ number three = add ( two , one ) ;
779+
780+ number two_t = mult ( two , t ) ;
781+ number three_minus_two_t = sub ( three , two_t ) ;
782+
783+ return mult ( t_sq , three_minus_two_t ) ;
740784}
0 commit comments