Karim Belabas on Sun, 06 Nov 2022 02:56:32 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Error message with pareval |
* Jean-Luc ARNAUD [2022-11-06 02:09]: > Hi all, > > I don't understand why this result in an error "incorrect type (t_REAL). > > Same behavior with versions 2.13.3, 2.15.0 and 2.15.1, all multithreading. > > Thanks for any explanation. > > > ? pareval([16*atan(1/5), 4*atan(1/239)]) > *** at top-level: pareval([16*atan(1/5),4*atan(1/239)]) > *** ^------------------------------------- > *** pareval: incorrect type in pareval (t_REAL). > *** Break loop: type 'break' to go back to GP prompt pareval evaluates a vector of functions (closures). Since you give it a vector of real numbers, you get an error. Here's the correct syntax, using inline closures ? pareval([()->16*atan(1/5), ()->4*atan(1/239)]) %1 = [3.1583289575980921339207962431166446952, 0.016736304008298895458152859837141810964] Another version using named functions: ? f() = 16*atan(1/5); ? g() = 4*atan(1/239); ? pareval([f, g]) %4 = [3.1583289575980921339207962431166446952, 0.016736304008298895458152859837141810964] Notes : - there is no automatic conversion of 'a constant C' into 'a function whose constant value is C'; the construction ()->C explicitly builds the latter. - in ()->C, the right hand side C is left unevaluated when the function is defined: ()->1+1 is a function that only computes 1+1 = 2 when (and each time) it is evaluated. - the last remark is very useful when you want to prevent evaluation until some point in the future. Cleaner (and faster) than using character strings and eval(), as in s = "1 + 1"; and later eval(s). Cheers, K.B. -- Karim Belabas / U. Bordeaux, vice-président en charge du Numérique Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77 http://www.math.u-bordeaux.fr/~kbelabas/ `