Ad argvmentvm transi
Topos Uranos

Svmmarivm

Nvmeri cvm digitis decimalibvs programmatis non svnt nvmeri reales mathematicae: svnt svbcopia finita nvmerorvm rationalivm qvorvm denominator est potentia nvmeri 2, et qvisqve valor qvi ad eam svbcopiam non pertinet svbstitvitvr proximo qvi pertinet. Haec lectio perscrvtatvr qvomodo nvmervs virgvlae flvitantis in 64 bit servetvr (signvm, exponens et mantissa), cvr 0.10.1 repraesentationem exactam non habeat et qvi valor eivs locvm occvpet, qvot digiti in float et in double tvti sint, qvomodo errores rotvndationis accvmvlentvr, cvr dvo nvmeri reales per == non comparentvr et qvomodo cvm tolerantia ivstificata comparentvr, et qvid sint infinitvm et valor non nvmericvs qvos forma reservat eventibvs qvi non capivntvr vel non exsistvnt.

Proposita discendi

  1. Explicare cvr 0.10.1 repraesentationem binariam exactam non habeat et qvi valor eivs loco servetvr.
  2. Praedicere effectvm rotvndationis in svmmis iteratis et in svmma nvmerorvm magnitvdinis valde diversae.
  3. Nvmeros reales cvm tolerantia idonea loco == comparare, electionem tolerantiae ivstificando.
  4. Inter float et double secvndvm praecisionem reqvisitam eligere, et infinitvm valoremqve non nvmericvm agnoscere.

Notatio scientifica in basi 2

Lectio Nvmeri integri eorvmqve repraesentatio ostendit integrvm nn bitorvm exacte 2n2^n valores consecvtivos repraesentare. Atqvi nvmeri cvm digitis decimalibvs difficvltatem aliam affervnt: inter dvos nvmeros reales qvoslibet infiniti alii svnt, nec vllvs nvmervs finitvs bitorvm omnes distingvere potest. Solvtio qvam omnia compvtatra hodierna adhibent eadem est qva scientia magnitvdines valde magnas vel valde parvas scribit: notatio scientifica. In basi 10, distantia media Terrae a Sole scribitvr 1.496×10111.496 \times 10^{11} metra; nvmervs habet signvm, pavcos digitos significantes (mantissam, 1.4961.496) et potentiam basis (exponentem, 1111), qvae dicit vbi virgvla ponatvr. Qvod si ita est, nvmero fixo digitorvm magnitvdines ordinvm valde diversorvm tegvntvr, eo pretio vt cvivsqve soli primi digiti serventvr.

Compvtatrvm idem in basi 2 facit. Qvisqve nvmervs a nihilo diversvs vno tantvm modo scribitvr vt

x=(−1)s×1.m1m2m3…m52 (2)×2ex = (-1)^{s} \times 1.m_1 m_2 m_3 \ldots m_{52} \, {}_{(2)} \times 2^{e}

vbi ss est signvm (0 pro positivo, 1 pro negativo), 1.m1m2…1.m_1 m_2 \ldots est mantissa binarie scripta, cvivs primvs digitvs semper est 1, et ee est exponens. Qvod primvs digitvs semper est 1 conseqventiam practicam habet: evm servare non oportet, et bit qvod sic parcitvr praecisioni lvcro est. Nomen virgvla flvitans hanc ipsam formam describit: virgvla non locvm fixvm inter digitos occvpat, sed secvndvm exponentem «flvitat».

Genvs double lingvae C++ in omnibvs compilatoribvs hodiernis formam binariam praecisionis dvplicis internationaliter normatam adhibet, 64 bitorvm: 1 bit pro signo, 11 bit pro exponente et 52 bit pro mantissa, sine digito initiali. Exponens dislocatvs servatvr: campvs 11 bitorvm continet e+1023e + 1023, ita vt valores sine signo ab 1 ad 2046 servet pro exponentibvs a −1022-1022 ad 10231023 (valores 0 et 2047 campi reservantvr nihilo, nvmeris valde parvis, infinito et valori non nvmerico, qvi in fine lectionis videbvntvr). Genvs float formam praecisionis simplicis adhibet, 32 bitorvm: 1 signi, 8 exponentis et 23 mantissae.

Bit alicvivs double videri possvnt. Programma seqvens adhibet std::bit_cast, ex capite <bit>, qvod 64 bit nvmeri vt integrvm sine signo 64 bitorvm denvo interpretatvr, nvllo mvtato; hic sine vlteriore explicatione adhibetvr, vt instrvmentvm ad memoriam inspiciendam. Specificatio formae {:064b} illvm integrvm binarie cvm 64 digitis scribit, vt in lectione priore, et {:016X} hexadecimaliter cvm 16.

Programma in C++
#include <bit>#include <cstdint>#include <print>​int main(){    const double tenth{0.1};    // 64 bit nvmeri, vt integer sine signo lecta.    const std::uint64_t bits{std::bit_cast<std::uint64_t>(tenth)};    std::println("{:064b}", bits);    std::println("{:016X}", bits);}
Exitvs
00111111101110011001100110011001100110011001100110011001100110103FB999999999999A
Exemplvm64 bit nvmeri 0.1

Figvra 64 bit qvae programma scripsit congregat et campvm post campvm legit.

Demonstratio

  1. 1+11+52=641 + 11 + 52 = 64

    64 bit, hexadecimaliter 3FB999999999999A. A sinistra ad dextram legvntvr: 1 bit signi, 11 exponentis et 52 mantissae.

  2. s=0s = 0

    Signvm est 0: nvmervs est positivvs.

  3. e=1019−1023=−4e = 1019 - 1023 = -4

    Campvs exponentis, 0111111101101111111011 binarie, valet 1019; ei svbtrahitvr dislocatio, 1023, et exponens est −4-4.

  4. m≈1.6000000000000000888m \approx 1.6000000000000000888

    Mantissa, cvm 1 initiali qvod non servatvr, binarie est 1.1001100110011…10101.1001100110011\ldots1010: grex 10011001 repetitvr et vltimvs grex, 10101010, svrsvm rotvndatvs est. Eivs valor est circiter 1.60000000000000008881.6000000000000000888.

  5. x=0.1000000000000000055511…≠0.1x = 0.1000000000000000055511\ldots \neq 0.1

    Nvmervs servatvs est +1.6000000000000000888×2−4+1.6000000000000000888 \times 2^{-4}, id est 0.1000000000000000055511…0.1000000000000000055511\ldots: valde prope 0.10.1, sed non 0.10.1.