@@ -19,6 +19,11 @@ type PyIntLong = i64;
1919#[ cfg( target_pointer_width = "64" ) ]
2020type PyIntLong = i128 ;
2121
22+ #[ cfg( target_pointer_width = "32" ) ]
23+ type PyUInt = u32 ;
24+ #[ cfg( target_pointer_width = "64" ) ]
25+ type PyUInt = u64 ;
26+
2227#[ pyfunction]
2328fn sum ( a : PyFloat , b : PyFloat ) -> PyResult < PyFloat > {
2429 Ok ( a + b)
@@ -142,7 +147,6 @@ fn atan(a: PyFloat) -> PyResult<PyFloat> {
142147
143148#[ pyfunction]
144149fn arctan ( x : PyFloat ) -> PyResult < PyFloat > {
145- /// Berechne den arcus tangens Wert mit der Leibniz-Reihe
146150 let mut result: PyFloat = 0.0 ;
147151 let mut term: PyFloat = x; // Startterm x^1 / 1
148152 let mut i: PyInt = 1 ;
@@ -170,6 +174,28 @@ fn calc_pi() -> PyResult<PyFloat> {
170174 Ok ( _pi)
171175}
172176
177+ fn facto ( n : PyUInt ) -> PyUInt {
178+ let mut result = 1 ;
179+ for i in 1 ..=n {
180+ let new_result = result * i;
181+ if new_result < result { // Überlaufprüfung
182+ panic ! ( "Integer overflow during factorial calculation" ) ;
183+ }
184+ result = new_result;
185+ }
186+ result
187+ }
188+
189+ #[ pyfunction]
190+ fn calc_e ( max : PyInt ) -> PyResult < PyFloat > {
191+ let mut result: PyFloat = 0.0 ;
192+ for i in 0 ..max {
193+ let factorial_result = facto ( i as PyUInt ) ; // Typkonvertierung, falls notwendig
194+ result += 1.0 / factorial_result as PyFloat ; // Korrekte Typumwandlung
195+ }
196+ Ok ( result)
197+ }
198+
173199/// A Python module implemented in Rust.
174200#[ pymodule]
175201fn highpymath ( m : & PyModule ) -> PyResult < ( ) > {
@@ -193,6 +219,7 @@ fn highpymath(m: &PyModule) -> PyResult<()> {
193219 m. add_function ( wrap_pyfunction ! ( atan, m) ?) ?;
194220 m. add_function ( wrap_pyfunction ! ( arctan, m) ?) ?;
195221 m. add_function ( wrap_pyfunction ! ( calc_pi, m) ?) ?;
222+ m. add_function ( wrap_pyfunction ! ( calc_e, m) ?) ?;
196223 m. add ( "MathValueError" , m. py ( ) . get_type :: < MathValueError > ( ) ) ?;
197224 Ok ( ( ) )
198225}
0 commit comments