A Sage real number a can be written in the form a=s⋅m⋅2e, where s, m and e are its sign, mantissa and exponent, given by the method .sign_mantissa_exponent
. For example,
sage: a = -12.345
sage: s, m, e = a.sign_mantissa_exponent(); s, m, e
(-1, 6949617174986097, -49)
sage: s*m*2^e.n()
-12.3450000000000
Let us see what is x=exp(−12π)=exp(−12π⋅i⋅i):
sage: x = exp(12*pi*i*i); x
cosh(12*pi) - sinh(12*pi)
We next compute the mantissa and exponent of 5+cosh(12π) and sinh(12π):
sage: (5 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139550, 1)
sage: sinh(12*pi).n().sign_mantissa_exponent()
(1, 5894625992139548, 1)
So SageMath gets 5+x as follows:
5+x=5+cosh(12π)−sinh(12π)≈5894625992139550⋅21−5894625992139548⋅21=2⋅2=4.
This justifies the result you get. You can repeat computations to check what happens with 6+x:
sage: (6 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139551, 1)
Hence: 6+x=6+cosh(12π)−sinh(12π)≈5894625992139551⋅21−5894625992139548⋅21=3⋅2=6.
The problem here is that you are reaching the limits of the double precision floating point arithmetic. Just use more digits:
sage: x = exp(12*pi*i*i)
sage: R = RealField(100)
sage: R(5 + x)
5.0000000000000000000000000000
![]() | 2 | No.2 Revision |
A Sage real number a can be written in the form a=s⋅m⋅2e, where s, m and e are its sign, mantissa and exponent, given by the method .sign_mantissa_exponent
. For example,
sage: a = -12.345
sage: s, m, e = a.sign_mantissa_exponent(); s, m, e
(-1, 6949617174986097, -49)
sage: s*m*2^e.n()
-12.3450000000000
Let us see what is $x=\exp(-12\pi)=\exp(-12\pi\cdot $x=\exp(-12\pi)=\exp(12\pi\cdot i\cdot i)$:
sage: x = exp(12*pi*i*i); x
cosh(12*pi) - sinh(12*pi)
We next compute the mantissa and exponent of 5+cosh(12π) and sinh(12π):
sage: (5 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139550, 1)
sage: sinh(12*pi).n().sign_mantissa_exponent()
(1, 5894625992139548, 1)
So SageMath gets 5+x as follows:
5+x=5+cosh(12π)−sinh(12π)≈5894625992139550⋅21−5894625992139548⋅21=2⋅2=4.
This justifies the result you get. You can repeat computations to check what happens with 6+x:
sage: (6 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139551, 1)
Hence: 6+x=6+cosh(12π)−sinh(12π)≈5894625992139551⋅21−5894625992139548⋅21=3⋅2=6.
The problem here is that you are reaching the limits of the double precision floating point arithmetic. Just use more digits:
sage: x = exp(12*pi*i*i)
sage: R = RealField(100)
sage: R(5 + x)
5.0000000000000000000000000000
![]() | 3 | No.3 Revision |
A Sage real number a can be written in the form a=s⋅m⋅2e, where s, m and e are its sign, mantissa and exponent, given by the method .sign_mantissa_exponent
. For example,
sage: a = -12.345
sage: s, m, e = a.sign_mantissa_exponent(); s, m, e
(-1, 6949617174986097, -49)
sage: s*m*2^e.n()
-12.3450000000000
Let us see what is x=exp(−12π)=exp(12π⋅i⋅i):
sage: x = exp(12*pi*i*i); x
cosh(12*pi) - sinh(12*pi)
We next compute the mantissa and exponent of 5+cosh(12π) and sinh(12π):
sage: (5 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139550, 1)
sage: sinh(12*pi).n().sign_mantissa_exponent()
(1, 5894625992139548, 1)
So SageMath gets 5+x as follows:
$$5+x=5+\cosh(12\pi)-\sinh(12\pi)\approx
$$\begin{aligned}5+x&=5+\cosh(12\pi)-\sinh(12\pi) \\ &\approx
5894625992139550\cdot 2^1 - 5894625992139548\cdot 2^1=2\cdot 2=4.$$2=4.\end{aligned}$$
This justifies the result you get. You can repeat computations to check what happens with 6+x:
sage: (6 + cosh(12*pi)).n().sign_mantissa_exponent()
(1, 5894625992139551, 1)
Hence:
$$6+x=6+\cosh(12\pi)-\sinh(12\pi)\approx
$$\begin{aligned}6+x&=6+\cosh(12\pi)-\sinh(12\pi) \\ &\approx
5894625992139551\cdot 2^1 - 5894625992139548\cdot 2^1=3\cdot 2=6.$$2=6.\end{aligned}$$
The problem here is that you are reaching the limits of the double precision floating point arithmetic. Just use more digits:
sage: x = exp(12*pi*i*i)
sage: R = RealField(100)
sage: R(5 + x)
5.0000000000000000000000000000