HOW CAN I SOLVE THIS?
Show older comments
Answers (1)
Jan
on 7 Mar 2021
What are the possible numbers in IEEE 754 floating point values between 1.0 and 2.0?
x = 1.0 + k * 2^-52 with k = 0, 1, ... 2^52
Run a loop over k to find a value with x * (1 / x) ~= 1.
9 Comments
kevin liu
on 7 Mar 2021
Walter Roberson
on 7 Mar 2021
use
format long g
x
num2hex(x)
kevin liu
on 8 Mar 2021
James Tursa
on 8 Mar 2021
Edited: James Tursa
on 8 Mar 2021
Looks like that 2nd while statement should be an if statement:
if((1/(1+x))*(1+x)~=1)
Also, you might want to disp(x) or use fprintf( ) with lots of digits to better help you identify which x you are dealing with when the display happens.
But note that your algorithm isn't guaranteed to print out the smallest such value that meets the condition. There may be values of x that are not exactly 1/2^n that meet the condition also and are smaller than the smallest 1/2^n that meets the condition, but you aren't testing for them. Jan's method tests for all of the values, even the ones that aren't exactly of the form 1+1/2^n. You might want to put a break statement inside the if block if you use Jan's method.
kevin liu
on 9 Mar 2021
format long g
for k=0:2^52
x = 1.0 + k*(2^-52) ;
if(x*(1/x) ~= 1)
disp(x)
disp(k)
num2hex(x)
break
end
end
Jan
on 9 Mar 2021
As Walter has said already, Matlab displays number with a few decimal places only as deafult. Use the format command to instruct Matlab to show more digits. I prefer fprintf to do this explicitly:
c = 2 ^ -52;
for k = 0:2^52
x = 1.0 + k * c;
if x * (1.0 / x) ~= 1.0
fprintf('%.16f %d\n', x, k);
end
end
kevin liu
on 9 Mar 2021
This is not an error. Computers store numbers with a limited precision. This has effects on arithmetics when using them. Famous examples:
0.1 + 0.1 + 0.1 == 0.3 % FALSE
any((0:0.1:1) == 0.3) % FALSE
1e17 + 1 - 1e17 == 1 % FALSE, it is 0
1e17 - 1e17 + 1 == 1 % TRUE
Welcome to the world of numerical maths. The first chapters of text books for this field of science explain the effects and teach methods to cope with them.
The alternativ is to use symbolic maths or numbers with unlimited precision. The later will exhaust the memory as soon as an irrational number is used, because you need an infinite amout of RAM to store it.
When I started to study, the loop took 1 day to find the first match of 1 * (1/x) ~= 1. Now Matlab takes seconds only. Running the full range over 2^52 elements will still take far too long. You can determine the concerned numbers by a formula also, but it is not trivial.
Categories
Find more on Number Theory in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!