###     Come vengono approssimati i numeri in R
# 2/3 è approssimato correttamente a 15 cifre:
print(2/3, 15)
[1] 0.666666666666667
# A 16 cifre l'ultima cifra può differire di 1 unità dal valore corretto:
print(2/3, 16)
[1] 0.6666666666666666
# Vediamo le approssimazioni a più cifre:
print(2/3, 17)
[1] 0.66666666666666663
print(2/3, 18)
[1] 0.66666666666666663
print(2/3, 19)
[1] 0.6666666666666666297
print(2/3, 20)
[1] 0.66666666666666662966
print(2/3, 21)
[1] 0.666666666666666629659
print(2/3, 22)
[1] 0.6666666666666666296592
# showTree arrotonda a 15 cifre, che (nel caso di un numero espresso
# direttamente) sono tutte buone:
library(codetools)
showTree(2/3)
    0.666666666666667
print(2/3, 15)
[1] 0.666666666666667
# Nel caso del risultato di un calcolo le cifre buone possono essere meno:
843.27-843.23,22
[1] 0.04
showTree(843.27-843.23)
    0.0399999999999636
# Le cifre strane, nel caso precedente e in questo, sono dovute al fatto che
# i calcoli sono fatti in base 2. Vediamolo meglio:
print(843.27-843.23,22)
[1] 0.03999999999996362021193
print(0.04-0.03999999999996362021193,22)
[1] 3.638062073818559838401e-14
# 0.03999999999996362021193 è il risultato che differisce da 0.04 del valore
# decimale corrispondente alle cifre binarie che si sono perse. Infatti
# 0.04 non corrisponde ad un numero binario finito, ma a:
# 0.00001010001111010111000010100011110101110000101000111101011100001...
# (come puoi ottenere con WolframAlpha scrivendo "0.04 in base 2"
# Ecco le prime cifre binarie trascurate, e come calcolarne il valore
# decimale con WolframAlpha:
# 0.000000000000000000000000000000000000000000001010001111010111_2
# Ottieni 3.63798x10^-14, in accordo col calcolo precedente.
# Eccone il valore anche con R:
2^-45+2^-47+2^-51+2^-52+2^-53+2^-54+2^-56+2^-58+2^-59+2^-60+2^-65
[1] 3.637978e-14