IEEE P1647/D1, January 2010

1 33. Real data types 2 3 4 This clause describes support in the e language of the real . Objects of type real are double 5 precision floating point numbers, similar to the precision of a C type double. 6 7 8 9 33.1 Real data type usage 10 11 In any context expecting a numeric object, a real object is acceptable, except in the following cases: 12 13 — Both operands of the shift operators (<<, >>) 14 15 — Bitwise operators (|, &, ^) 16 17 — Bitwise routines 18 19 — Modulo (%) 20 21 — odd() 22 23 — even() 24 25 26 33.2 Real literals 27 28 29 Real literals are numbers that have a decimal point or an exponential part or both. If a decimal point exists, 30 there must be digits on both sides of the decimal point. Underscores can be added for readability and are 31 ignored. 32 33 34 35 Table 46—Examples of real literals 36 37 38 Real Constant Value 39 40 5.3876e4 53,876 41 42 4e-11 0.00000000004 43 1e+5 100,000 44 45 7.321E-3 0.007321 46 47 3.2E+4 32,000 48 49 0.5e-6 0.0000005 50 51 0.45 0.45 52 6.e10 60,000,000,000 53 54 55 56 57 33.3 Real constants 58 59 60 The real constants in Table 47 and Table 48 are defined in both e code and in C code that includes a suitable 61 header file: 62 63 NOTE— All mathematical constants are prefixed by P1647_M_. 64 65 NOTE— All physical constants are prefixed by P1647_P_.

427 Copyright © 2020 IEEE. All rights reserved. IEEE P1647/D1, January 2010

1 Table 47—Mathematical constants 2 3 4 Constant Value 5 6 IEEE_1647_M_E e 7 8 IEEE_1647_M_LOG2E Logarithm base 2 of e 9 10 IEEE_1647_M_LOG10E Logarithm base 10 of e 11 IEEE_1647_M_LN2 Natural logarithm of 2 12 13 IEEE_1647_M_LN10 Natural logarithm of 10 14 15 IEEE_1647_M_PI PI 16 17 IEEE_1647_M_TWO_PI 2*PI 18 19 IEEE_1647_M_PI_2 PI/2 20 IEEE_1647_M_PI_4 PI/4 21 22 IEEE_1647_M_1_PI 1/PI 23 24 IEEE_1647_M_2_PI 2/PI 25 26 IEEE_1647_M_2_SQRTPI 2/sqrt(PI) 27 28 IEEE_1647_M_SQRT2 sqrt(2) 29 IEEE_1647_M_SQRT1_2 sqrt(1/2) 30 31 32 33 Table 48—Physical constants 34 35 36 Constant Value 37 38 IEEE_1647_P_Q Charge of electron in coulombs 39 40 IEEE_1647_P_C Speed of light in vacuum in 41 meters/sec 42 43 IEEE_1647_P_K Boltzmann’s constant in joules/ 44 kelvin 45 IEEE_1647_P_H Planck’s constant in joules*sec 46 47 IEEE_1647_P_EPS0 Permittivity of vacuum in farads/ 48 meter 49 50 IEEE_1647_P_U0 Permeability of vacuum in henrys/ 51 meter 52 53 IEEE_1647_P_CELSIUS0 Zero Celsius in kelvin 54 55 56 57 33.4 Conversion between real andinteger data types 58 59 Automatic casting is performed between the real type and the other numeric types. 60 61 62 Converting a real type object to an integer type object uses the following process: 63 64 a) The object is first converted to type int (:*) with the value of the largest integer whose absolute 65 value is less than or equal to the absolute value of the real object.

428 Copyright © 2010 IEEE. All rights reserved. IEEE P1647/D1, January 2010

1 b) The object is then converted to the expected integer type. 2 3 4 Additional rules apply to converting real objects to integer objects: 5 — If the object’s floating-point value is infinity (inf), negative infinity (-inf), or Not-a-Number (NaN), 6 an error will be emitted when trying to convert to an integer value. 7 8 — When converting an integer object to the real type, the object is converted to the value closest to the 9 integer value that can be represented in the double precision format. 10 11 12 When converting from an integer data type to a real, the integer value is simply converted to its identical 13 value represented as a real. 14 15 16 33.5 Conversions using the as_a() operator 17 18 Converting a non-numeric scalar type object to a real type object using the as_a() operator uses the 19 20 following process: 21 a) The scalar type object is first converted to an integer value. 22 23 b) The object is then converted to a real value according to process and rules listed in 33.4. 24 25 Additional rules apply to converting non-numeric scalar objects to real objects using the as_a() operator: 26 27 — When converting a string value to real using the as_a() operator, the string is parsed as if it was a 28 real literal, and the value of the real literal is returned. 29 30 — If the string does not conform to the definition of a real literal, an error is emitted. 31 32 33 33.6 Real data type precision, data conversion, and sign extension 34 35 The rules for deciding precision, performing data conversion, and sign extension are as follows: 36 37 a) Determine the context of the expression. The context may be comprised of up to three types. 38 b) If all types involved in an expression and its context are integer values of 32 bits in width or less: 39 40 1) The operation is performed in 32 bits. 41 42 2) If any of the types are unsigned, the operation is performed with unsigned integers. 43 NOTE—Decimal constants are treated as signed integers, whether they are negative or not. All 44 other constants are treated as unsigned integers unless preceded by a hyphen. 45 46 3) Each operand is automatically cast, if necessary, to the required type. 47 NOTE—Casting of small negative numbers (signed integers) to unsigned integers produces 48 large positive numbers. 49 50 c) If all types are integer types, and any of the types is greater than 32 bits: 51 1) The operation is performed in infinite precision (int(bits:*)). 52 53 2) Each operand is zero-extended if it is unsigned, or sign-extended if it is signed, to infinite pre- 54 cision. 55 56 d) If any of the types is a real type, then the operation is done in double precision, and all objects 57 should first be converted according to the rules described above. 58 59 60 33.7 Packing values for real types 61 62 Real values take up 64 bits when packed. These bits are actual representation of the double value. The 63 64 effect of the various packing options on real type objects is similar to their effect on an integer (bits:64) 65 value.

429 Copyright © 2020 IEEE. All rights reserved. IEEE P1647/D1, January 2010

1 33.8 Printing real values 2 3 4 By default, real values are printed similar to the %g format of printf in C. When using formatted printing, 5 you can use the %e, %f, and %g formats similar to C. Printing an integer value with these formats will cause 6 an automatic conversion to the real type. Printing real values with integer formatting will cause an 7 automatic conversion to int (bits:*). 8 9 10 33.9 Arithmetic routines supporting real type 11 12 13 The following arithmetic routines support of real type objects: 14 15 16 Table 49—Arithmetic routines supporting real types 17 18 19 Routine Description 20 21 floor(real): real Returns the largest integer that is less than or equal to the parameter. 22 23 ceil(real): real Returns the smallest integer that is greater than or equal to the parameter. 24 25 round(real): real Returns the closest integer to the parameter. In the case of a tie then it returns the 26 integer with the higher absolute value. 27 28 log(real): real Returns the natural logarithm of the parameter. 29 log10(real): real Returns the base-10 logarithm of parameter. 30 31 pow(real, real): real Returns the value of the first parameter raised to the power of second one. 32 33 sqrt(real): real Returns the square root of the parameter. 34 35 exp(real): real Returns the value of e raised to the power of the parameter. 36 37 sin(real): real Returns the sine of the parameter given in radians. 38 cos(real): real Returns the cosine of the parameter given in radians. 39 40 tan(real): real Returns the tangent of the parameter given in radians. 41 42 asin(real): real Returns the arc sine of the parameter. 43 44 acos(real): real Returns the arc cosine of the parameter. 45 46 atan(real): real Returns the arc tangent of the parameter. 47 sinh(real): real Returns the hyperbolic sine of the parameter. 48 49 cosh(real): real Returns the hyperbolic cosine of the parameter. 50 51 tanh(real): real Returns the hyperbolic tangent of the parameter. 52 53 asinh(real): real Returns the inverse hyperbolic sine of the parameter. 54 55 acosh(real): real Returns the inverse hyperbolic cosine of the parameter. 56 atanh(real): real Returns the inverse hyperbolic tangent of the parameter. 57 58 atan2(real, real): real Returns the arc tangent of the two parameters. 59 60 hypot(real, real): real Returns the distance of the point defined by the two parameters from the origin. 61 62 is_nan(real): bool Returns TRUE if the parameter’s value is Not-a-Number (NaN). 63 64 is_finite(real): bool Returns TRUE if the parameter’s value is a finite real value that is, it is not infinity, 65 negative infinity, or NaN).

430 Copyright © 2010 IEEE. All rights reserved. IEEE P1647/D1, January 2010

1 NOTE—For integer routines like ilog(), ilog10(), ilog2(), ipow(), and isqrt(), whose return type is based on the 2 expected type, if the expected type is real, then the return type is int (bits:*). 3 4 5 33.10 Random routines 6 7 Specman supports the following routines to generate random real numbers: 8 9 10 11 Table 50—Random routines 12 13 14 Routine Description 15 16 rdist_uniform(from: real, Returns a random real number using uniform distribution in the range from 17 to:real): real to to. 18 19 20 21 33.11 C macros that support real type objects 22 23 The following C interface macros support real type objects: 24 25 26 Table 51—C interface macros supporting real type objects 27 28 29 Macro Description 30 31 P1647_REAL_NEW(c_double_v Returns a Specman allocated real object with its value specified 32 by the parameter c_double_value of type C double. 33 alue) 34 P1647_REAL_GET () Receives an object of type SN_TYPE(real) and returns a C double 35 value. 36 37 P1647_TYPE(real) Declares an e real type in C. 38 39 40 41 33.12 Real type limitations 42 43 44 — The key of a keyed list cannot be of type real. 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

431 Copyright © 2020 IEEE. All rights reserved. IEEE P1647/D1, January 2010

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

432 Copyright © 2010 IEEE. All rights reserved.