Kio estas kio? · bei.pm

Ĉi tiu teksto estis aŭtomate tradukita de OpenAI GPT-4o Mini.

En ĉi tiu rubriko estas artikoloj pri dosierformatoj kaj kontraŭ-ingeneriado.

Tamen, estas tiel:
Ekzistas multaj programlingvoj tie ekstere kaj multaj homoj, kiuj konas iujn aferojn sub tute malsamaj nomoj - aŭ eĉ ne havas iun ajn ideon pri la ekzisto de fundamentaj aferoj, ĉar ilia programlingvo abstrahigas tion de ili.

tl;dr:
Mia notacio ĝenerale baziĝas sur C99 <stdint.h>. Tiuj, kiuj povas kompreni tiun ĉi notacion, certe sukcesos kun mia notacio.

Entjero

Integer estas simple dirite entjeroj, tio estas nombroj sen dekuma parto.

En datumformatoj, entjeroj ĝenerale estas difinitaj ene de fiksita nombrospektrumo, kvazaŭ rezolucio. Mi indikas ĉi tion en bitoj - pro la kialo, ke "bajto" kaj rilataj tipoj (vorto, kvord, ...) ĝenerale estas platform-dependaj.

Krome, oni distingas inter naturaj nombroj (ℕ, tio estas, sen signo - Unsigned) kaj entjeroj (ℤ, tio estas, kun signo - Signed).
Ĉi tiu informo estas videbla per signo en la nomo (us).

Estas eble, ke signo-portantaj entjeroj estas prezentitaj aŭ kiel unu-komplemento aŭ kiel du-komplemento.
Se ne indikita alimaniere, la du-komplemento estas uzata, ĉar ĝi estas la preferata prezento en moderna komputado.

Sen-signaj nombroj estas indikitaj de mi en miaj dokumentoj kiel uint, kun sekva indiko de la precizeco en bitoj.
Signo-portantaj nombroj estas indikitaj de mi en miaj dokumentoj kiel sint, ankaŭ kun sekva indiko de la precizeco en bitoj.

Mi ne uzas la datumtipon "char" por signoj, ĉar signoserioj ĝenerale nur reprezentiĝas kiel entjeraj valoroj-serioj kun speciala interpreto.
Ili do estas prezentitaj kiel uint(8)[].

Ekzemploj:

Notacio C99 stdint.h-Ekvivalento Priskribo Numeraro
uint(16) uint16_t Ne-negativa Entjero, 16 Bit longa 0 - 65.535
sint(8) int8_t Signita Entjero, 8 Bit longa, duonkomplemento -126 - 127
uint(24) uint32_t:24 Ne-negativa Entjero, 24 Bit longa 0 - 16.777.216

Festkomma-valoroj

Fiksaj-punktoj estas nombroj el la spektro de Raciaj Nombroj (Q), kiuj do havas punkton kaj decimalajn lokojn.

Por fiksaj-punktoj la pozicio de la ponto estas antaŭdifinita per la datentipo - tial ankaŭ la nomo.
Tio rezultigas fiksan nombron da valoroj por nombroj de ĉi tiu datentipo; matematikamente esprimite, la nombraj spacoj estas finaj.

En la realeco, ĉi tiu datentipo estas ĉefe uzata en platformoj sen sufiĉe rapida flospunkta hardvaro, ĉar la kalkulo de fiksaj-punktoj povas esti farita per integer-unuoj.

Ili ankaŭ estas uzataj, ekzemple, de datumbazaj administradaj sistemoj, kiam fiksaj postuloj devas esti plenigitaj.
Pensu ekzemple pri sistemoj por permanenta stokado de financaj datumoj; la plej multaj valutoj limigas sin al 2 lokoj post la punkto. (Tamen, ne estas saĝe uzi fiksajn-punktojn por ĉi tio; pli saĝe estas rekte stoki la plej malgrandan valutan unuon kiel integeron kaj lasi la reston de la montrado al la programo)

Analoge al la integeraj indicoj, mi donas la rezolucion de la nombro antaŭ kaj post la punkto:
ufixed(9,7) indikas datentipon, kiu rezervas 9 biton sen signo por la valoro antaŭ la punkto, kaj 7 biton por la valoro post la punkto; tial en sumo ĝi estas 16 bitan larĝa kaj povas, ekzemple, kovri areon de (0,0) ĝis (511,127) kiel vektoro de du sendependaj integeroj.
Tamen, ĉi tiu interpreto perdus 28 nombrojn en sia dekuma montrado, ĉar oni verŝajne limigus sin al maksimumo de (511,99) en praktiko.

Anstataŭ direkta interpreto de la fiks-punkta valoro kiel vektoro el 2 apartaj integeroj - kio preskaŭ ĉiam signifas neuzatan dataron ĉe la konvertiĝo al dekumaj nombroj kaj manan transporton - la decimalaj lokoj povas ankaŭ esti interpretataj kiel frakcio de ĝia tuta rezolucio.
Per la ekzemplo de la menciita ufixed(9,7), oni ricevas frakcion kun denominatoro de 27 - do la nombro da valoroj iras de 0,00 ĝis 511 + 126127 Por konverti ĝin al dekuma montrado, la decimalaj lokoj devas esti dividitaj per 128.
Per ĉi tiu varianto pli facile eblas efektivigi kalkul-operaciojn, ĉar la transporto rezultas aŭtomate, kio faras ĉi tiun varianton ĝenerale preferata.
Tamen, ĉi tiu varianto havas la malavantaĝon, ke la decimalaj lokoj en la dekuma montrado ne plu havas garantian rezolucion; unu sola decimalloko ne plu ekvivalentas al 0.01, sed al 0.007874, kio kaŭzos konvenajn rotacikajn erarojn.

Kiu interpretmetodo estas uzata estos dokumentita laŭ la lokon de uzo.

Flosaj aŭ flosantaj valoroj

Flosantaj valoroj estas matematike pli kompleksaj esprimoj, kie tuta nombro kun fiksita difino estas esprimita per matematika termino tiel, ke la dekuma parto estas efektive formita per desplazado - kaj tiel rekte orientiĝas al la scienca notacio.
La plej ofta maniero por realigi tion estis normaligita per IEEE 754 kaj ekde tiam estas internacie agnoskita.

Flosanta valoro ĝenerale konsistas el la sekvaj komponantoj:

Signo (01) Eksponento Mantiso

Dum la signo povas esti facile eltirita kiel binara Jes/Ne-informo, la vera nombro formiĝas per la ekvacio
Mantiso * 2Eksponento

Krome ekzistas kelkaj konstantaj valoroj, kiuj kovras specialajn kazojn de rajonaj nombroj - inter ili ±∞ kaj NaN ("neniu valida nombro").

Flosantaj valoroj estas precipe utilaj kiam la precizeco ne estas tiom grava, ĉar kun ĉi tiu tipo de valoroj neeviteble okazas rondigaj eraroj kaj tiel perdo de precizeco. Tipike, flosantaj valoroj estas uzataj, ekzemple, por difini koordinatojn, kiel vertikaj vektoroj en 3D-modeloj aŭ Bézier-/Spline-kurboj por optikaj reprezentaj celoj.

En la datumformatado, flosantaj valoroj estas specifitaj kiel float(Mantiso, Eksponento).
Se formato diferenca de IEEE 754 estas uzata, tio estos indikita konforme.