Hlavní navigace

Norma IEEE 754 a příbuzní: formáty plovoucí řádové tečky

31. 5. 2006
Doba čtení: 14 minut

Sdílet

Ve druhé části seriálu si podrobněji popíšeme standardní formáty popsané v normě IEEE 754. Kromě toho se zmíníme o dalších FP formátech, například formátu Minifloat, Microfloat, Borlandském datovém typu real a také o formátu používaném na možná nejúspěšnějším osmibitovém domácím počítači: ZX Spectru.

Obsah

1. Formáty plovoucí řádové tečky podle normy IEEE 754
2. Základní formát single dle normy IEEE 754
3. Základní formát double dle normy IEEE 754
4. Rozšířený formát extended/temporary
5. Plovoucí řádová čárka na ZX Spectru
6. FP formát firmy Borland: real
7. FP formát Minifloat
8. FP formát Microfloat
9. Obsah třetího pokračování tohoto seriálu

1. Formáty plovoucí řádové tečky podle normy IEEE 754

V předchozí části tohoto seriálu jsme si uvedli některé základní rozdíly mezi formáty pevné řádové binární tečky (FX – Fixed Point) a pohyblivé řádové binární tečky (FP – Floating Point), včetně vyjmenování předností a záporů obou těchto formátů. Dnes si podrobněji popíšeme některé často používané formáty pohyblivé řádové tečky, z nichž některé jsou implementovány buď v matematických koprocesorech (FPU – Floating Point Unit), nebo ve specializovanějších číslicových obvodech, například na grafickém akcelerátoru v GPU (Graphics Processing Unit) či v signálových procesorech (DSP – Digital Signal Processor). Při práci s formáty plovoucí řádové tečky dříve či později narazíme na mezinárodní normu IEEE 754, ve které jsou standardizovány dva základní FP formáty a dále jsou zde uvedeny možnosti rozšiřování těchto formátů pro dosažení větší přesnosti a/nebo rozsahu zpracovávaných hodnot. Alespoň základní znalost normy IEEE 754 nám umožní pochopit limity FP formátů a důvody, které nás mohou v některých případech vést k volbě FX formátů.

V normě IEEE 754 (která je mimochodem v platnosti již od roku 1985) jsou specifikovány nejenom vlastní formáty uložení numerických hodnot v systému pohyblivé řádové tečky (FP formátu), ale i pravidla implementace aritmetických operací s těmito hodnotami, včetně některých konverzí. Konkrétně je v této normě, jak již víme z první části seriálu, popsáno:

  1. Základní (basic) a rozšířený (extended) formát uložení numerických hodnot.
  2. Způsob provádění základních matematických operací:
    • součet
    • rozdíl
    • součin
    • podíl
    • zbytek po dělení
    • druhá odmocnina
    • porovnání
  3. Pravidla konverze mezi celočíselnými formáty (integer) a formáty s plovoucí řádovou tečkou.
  4. Způsob konverze mezi různými formáty s plovoucí řádovou tečkou (singledouble atd.).
  5. Způsob konverze základního formátu s plovoucí řádovou tečkou na řetězec číslic (včetně nekonečen a nečíselných hodnot).
  6. Práce s hodnotami NaN (not a number) a výjimkami.

Základní a rozšířené formáty pro uložení numerických hodnot podle normy IEEE 754 budou popsány ve druhé, třetí a čtvrté kapitole, zde si však uveďme podstatu reprezentace těchto hodnot a způsob provádění základních i pokročilejších matematických operací. Vybraná podmnožina racionálních čísel může být vyjádřena vztahem:

XFP=(-1)s × 2exp-bias × m

kde:

  • XFP značí reprezentovanou numerickou hodnotu z podmnožiny racionálních čísel (ta je zase podmnožinou čísel reálných). Díky vyhrazeným (speciálním) hodnotám je možné rozlišit kladnou a zápornou nulu i kladné a záporné nekonečno. Také se může uložit nečíselná hodnota: NaN – (Not a Number), která je výsledkem některých matematicky nedefinovaných operací, například 0/0 nebo 00.
  • 2 je báze, někdy také nazývaná radix. U IEEE 754 je to vždy dvojka, protože výpočty s bází dvě jsou pro číslicové obvody nejjednodušší. V minulosti se používaly i jiné báze, například 8, 16 nebo i 10.
  • exp je vždy kladná hodnota exponentu posunutého o hodnotu bias
  • bias je hodnota, díky které je uložený exponent vždy kladný. Tato hodnota se většinou volí dle vztahu: bias=2eb-1-1, kde eb je počet bitů vyhrazených pro exponent. Pro specifické účely je však možné zvolit i jinou hodnotu.
  • m je mantisa, která je u formátů IEEE 754 vždy kladná
  • s je znaménkový bit nabývající hodnoty 0 nebo 1. Pokud je tento bit nulový, je reprezentovaná hodnota XFP kladná, v opačném případě se jedná o zápornou hodnotu. Vzhledem k tomu, že je jeden bit vyhrazen na uložení znaménka, je možné rozlišit kladnou a zápornou nulu.

Podle bitové šířky čísel exp, bias a m se rozlišují základní a rozšířené formáty FP čísel; norma IEEE 754 přitom explicitně zmiňuje dva základní formáty: jednoduchá přesnost (druhá kapitola) a dvojitá přesnost (třetí kapitola). V těchto kapitolách se také zmíníme o normalizovaných, nenormalizovaných a denormalizovaných číselných hodnotách.

2. Základní formát single dle normy IEEE 754

Prakticky všechny v dnešní době používané matematické koprocesory (FPU), programovatelné grafické procesory (GPU) nebo systémové i aplikační knihovny, které pracují s číselnými hodnotami uloženými ve formátu pohyblivé řádové binární tečky, podporují formát jednoduché přesnosti, který také bývá nazýván single; v některých programovacích jazycích (včetně stále populárního Céčka a neméně populární Javy) pak float. Tento formát je charakteristický tím, že se pro uložení numerické hodnoty používá třiceti dvou bitů (4 byty), což pro mnoho aplikací představuje dobrý poměr mezi rozsahem hodnot, přesností a nároky na úložný prostor, nehledě na to, že mnoho architektur používá 32 bitové sběrnice. Oněch 32 bitů je rozděleno do třech částí. V první části (představované nejvyšším bitem) je uloženo znaménko, následuje osm bitů pro uložení posunutého exponentu a za nimi je zbývajících 23 bitů, které slouží pro uložení mantisy. Celé třiceti dvoubitové slovo s FP hodnotou tedy vypadá následovně:

bit 31 30   29 … 24   23 22   21 … 3   2   1   0
význam s exponent (8 bitů) mantisa (23 bitů)

Exponent je přitom posunutý o hodnotu bias, která je nastavena na 127, protože je použit výše uvedený vztah:

bias=2eb-1-1

a po dosazení eb=8 (bitů) dostaneme:

bias=28–1-1=27-1=128–1=127

Vzorec pro vyjádření reálné hodnoty vypadá následovně:

Xsingle=(-1)s × 2exp-127 × m

Uložení znaménka číselné hodnoty je jednoduché: pokud je znaménkový bit nastavený na jedničku, jedná se o zápornou hodnotu, v opačném případě jde o hodnotu kladnou. Exponent je uložený v takzvané posunuté formě, tj. jako binárně zakódované celé číslo v rozsahu 0..255. Po vyjádření neposunutého exponentu dostáváme rozsah –127..128, obě krajní hodnoty jsou však použity pro speciální účely, proto dostáváme rozsah exponentů –126..127 pro normalizovaná čísla (krajními hodnotami jsou takové exponenty, které mají všechny bity buď jedničkové nebo naopak nulové). Ještě si však musíme říci, jakým způsobem je uložena mantisa. Ta je totiž většinou (až na velmi malá čísla) normalizovaná, což znamená, že se do mantisy ukládají pouze hodnoty v rozsahu <1,0;2,0-ε>. Vzhledem k tomu, že první bit umístěný před binární tečkou je u tohoto rozsahu vždy nastavený na nulu, není ho zapotřebí ukládat, což znamená, že ušetříme jeden bit z třicetidvou­bitového slova. Pro normalizované hodnoty platí následující vztah:

Xsingle=(-1)s × 2exp-127(1.M)2

kde M je hodnota bitového vektoru mantisy, tj.:

M=m22-1+m21-2+m20-3+…+m1-22+m0-23

Rozsah hodnot, jež je možné reprezentovat pomocí jednoduché přesnosti v normalizovaném tvaru je –3,4×1038 až 3,4×1038. Nejnižší reprezentovatelná (normalizovaná) hodnota je rovna 1,17549×10-38, denormalizovaná pak 1,40129×10-45. Jak jsme k těmto hodnotám došli? Zkuste se podívat na následující vztahy:

hexadecimální hodnota výpočet FP dekadický výsledek normalizováno
0×00000001 2-126×2-23 1,40129×10-45 ne
0×00800000 2-126 1,17549×10-38 ano
0×7F7FFFFF (2–2-23)×2127 3,4×1038 ano

Tyto hodnoty jsou pro provádění některých výpočtů, například pro porovnávání FP hodnot, velmi užitečné, proto je například v programovacím jazyku C možné použít následující konstanty umístěné v normou popsaném hlavičkovém souboru:

#define FLT_MIN      1.17549435E-38F
#define FLT_MAX      3.40282347E+38F
#define FLT_EPSILON  1.19209290E-07F 

Ještě si musíme vysvětlit význam těch exponentů, které mají minimální a maximální hodnotu, tj. jsou buď nulové, nebo mají hodnotu 255 (obě samozřejmě před posunem). Vše je přehledně uvedeno v následující tabulce:

s-bit exponent mantisa význam šestnáctkově
0 0<e<255 >0 normalizované kladné číslo
1 0<e<255 >0 normalizované záporné číslo
0 0 >0 denormalizované kladné číslo
1 0 >0 denormalizované záporné číslo
0 0 0 kladná nula 0×00000000
1 0 0 záporná nula 0×80000000
0 255 0 kladné nekonečno 0×7F800000
1 255 0 záporné nekonečno 0×FF800000
0 255 >0 NaN – not a number
1 255 >0 NaN – not a number

Denormalizovaná čísla jsou takové hodnoty, u kterých není první (explicitně nevyjádřený) bit mantisy roven jedničce, ale naopak nule. Výpočty s těmito velmi malými hodnotami nejsou přesné, zejména při násobení a dělení. Při ukládání denormalizovaných čísel je exponent vždy nastaven na nejnižší hodnotu, tj. -126 a nejvyšší (explicitně neukládaný) bit mantisy je nulový, nikoli jedničkový, jak je tomu u normalizovaných hodnot. Hodnota typu NaN vznikne v případě, že je použita operace s nejasným výsledkem, například 0/0, 00 nebo, a to v praxi snad nejčastěji, při odmocňování záporných čísel. Nekonečná hodnota vzniká typicky při dělení nulou (zde je možné zjistit znaménko), nebo při vyjádření funkcí typu log(0) atd.

Pro ilustraci uložení FP hodnot v třiceti dvoubitovém slově je možné přeložit a spustit následující demonstrační program, který vypíše hexadecimální, bitovou a také rozloženou formu zadaných FP čísel. Pro programátory, kteří s céčkem nepracují, může být zajímavé použití dvojího operátoru !! (dvojitá negace), který slouží k převodu libovolné nenulové hodnoty na jedničku; dále pak idiomu „+=“[index], kdy se pomocí indexu 0 či 1 vybere buď první nebo druhý znak ze zadaného řetězce:

#include <stdio.h>
#include <stdlib.h>

#define DELKA_SIG 1                     // bitová délka znaménka
#define DELKA_EXP 8                     // bitová délka exponentu
#define DELKA_MAN 23                    // bitová délka mantisy
#define DELKA (DELKA_SIG+DELKA_EXP+DELKA_MAN) // celková bitová délka FP hodnoty
#define BIAS      127                   // posun exponentu

// unie, které slouží k rozkladu FP hodnoty na její bitové složky
typedef union t_fp32 {
    float        fp;                    // hodnota uložená v FP formátu
    unsigned int uint;                  // 32 bitové slovo na stejném místě paměti
    struct {                            // rozklad 32 bitového slova na tři složky:
        unsigned int mantisa:DELKA_MAN; // - 23bitovou mantisu
        unsigned int exp:DELKA_EXP;     // - 8bitový exponent
        unsigned int signum:DELKA_SIG;  // - 1bitové znaménko
    } fp_deleny;
} t_fp32;

// funkce pro výpis vnitřní struktury FP hodnoty
void showFP(float fp)
{
    t_fp32 fp32;                        // unie s přiřazovanými FP hodnotami
    int i;                              // počitadlo smyčky
    int val;                            // FP hodnota převedená na 32bitové slovo

    fp32.fp=fp;                         // zapsat FP hodnotu do unionu
    val=fp32.uint;                      // získat slovo s FP hodnotou
    printf("%7.3f    %08x    ", fp32.fp, fp32.uint); // výpis FP hodnoty a příslušného slova
    for (i=0; i<DELKA; i++) {           // převod na řetězec bitů (do dvojkové soustavy)
        putchar(!!(val & (1<<(DELKA-1)))+'0'); // výpis hodnoty aktuálně nejvyššího bitu
        if (!i || i==DELKA_EXP) putchar(' ');  // po znaménku a za exponentem udělat mezeru
        val=val<<1;                     // posun na další (méně významný) bit
    }
    printf("   %c  %+4d  %f\n",
           "+-"[fp32.fp_deleny.signum], // zjištění znaménka podle nejvyššího bitu
           fp32.fp_deleny.exp-BIAS,     // posun exponentu o bias
           1.0+fp32.fp_deleny.mantisa/(float)(1<<DELKA_MAN)); // výpis mantisy (pouze pro normalizovaná čísla)
}

int main(void)
{
    float  values[]={+0, -0, 1.0, -1.0, 2.0, -2.0, 10, 100, 999, 0.1, 0.01};
    int    i;
    for (i=0; i<11; i++)                // výpis vnitřní struktury všech zadaných hodnot
       showFP(values[i]);
    return 0;
}

// finito 

Výsledek běhu programu pro zadané hodnoty (první dva řádky s nadpisy sloupců byly dopsány ručně):

  FP       šestnáctkový   binární výstup                    decimální výstup
  hodnota  výstup      s exponent mantisa                   s   exp  mantisa
  0.000    00000000    0 00000000 00000000000000000000000   +  -127  1.000000
  0.000    00000000    0 00000000 00000000000000000000000   +  -127  1.000000
  1.000    3f800000    0 01111111 00000000000000000000000   +    +0  1.000000
 -1.000    bf800000    1 01111111 00000000000000000000000   -    +0  1.000000
  2.000    40000000    0 10000000 00000000000000000000000   +    +1  1.000000
 -2.000    c0000000    1 10000000 00000000000000000000000   -    +1  1.000000
 10.000    41200000    0 10000010 01000000000000000000000   +    +3  1.250000
100.000    42c80000    0 10000101 10010000000000000000000   +    +6  1.562500
999.000    4479c000    0 10001000 11110011100000000000000   +    +9  1.951172
  0.100    3dcccccd    0 01111011 10011001100110011001101   +    -4  1.600000
  0.010    3c23d70a    0 01111000 01000111101011100001010   +    -7  1.280000 

Jak výsledky interpretovat? Zvolme si například číslo 10,000 (dekadicky). Pro toto číslo má exponent po posunutí hodnotu 3 a mantisa po přidání jedničky před binární tečku hodnotu 1,25. Proto provedeme operaci:

23×1,25=8×1,2­5=10,000

3. Základní formát double dle normy IEEE 754

FP formát dvojité přesnosti (double), jenž je definován taktéž normou IEEE 754, se v mnohém podobá formátu s jednoduchou přesností (single), pouze se zdvojnásobil celkový počet bitů, ve kterých je hodnota uložena, tj. místo 32 bitů se používá 64 bitů. Právě to je příčinou, proč se tento formát nazývá double, ve skutečnosti je přesnost více než dvojnásobná. 64 bitů alokovaných pro FP hodnotu je v tomto případě rozděleno následujícím způsobem:

  1. 1 bit pro znaménko
  2. 11 bitů pro exponent
  3. 52 bitů pro mantisu

Bitově vypadá rozdělení následovně:

bit 63 62 … 52 51 … 0
význam s exponent (11 bitů) mantisa 52( bitů)

Exponent je posunutý o hodnotu bias=2047 a vzorec pro výpočet reálné hodnoty vypadá takto:

Xdouble=(-1)s × 2exp-2047 × m

Přičemž hodnotu mantisy je možné pro normalizované hodnoty získat pomocí vztahu:

m=1+m51-1+m50-2+m49-3+…+m0-52

(mx představuje x-tý bit mantisy)

Rozsah hodnot ukládaných ve dvojité přesnosti je –1,7×10308..1,7×10308, nejmenší možná nenulová hodnota je rovna 2,2×10-308. Minimální a maximální hodnota exponentu má opět speciální význam, který je vysvětlen (spolu s normalizovanými čísly) v následující tabulce:

s-bit exponent mantisa význam
0 0<e<2047 >0 normalizované kladné číslo
1 0<e<2047 >0 normalizované záporné číslo
0 0 >0 denormalizované kladné číslo
1 0 >0 denormalizované záporné číslo
0 0 0 kladná nula
1 0 0 záporná nula
0 2047 0 kladné nekonečno
1 2047 0 záporné nekonečno
0 2047 >0 NaN – not a number
1 2047 >0 NaN – not a number

V programovacím jazyku C jsou ve standardních hlavičkových souborech dostupné symbolické konstanty, které se často používají (resp. kvůli přenositelnosti by se měly používat), při některých matematických operacích:

#define DBL_MAX     1.7976931348623157E+308
#define DBL_MIN     2.2250738585072014E-308
#define DBL_EPSILON 2.2204460492503131E-016 

4. Rozšířený formát extended/temporary

Kromě obou základních formátů (tj. jednoduché i dvojité přesnosti) je v normě IEEE 754 povoleno používat i rozšířené formáty. Na platformě x86 je při výpočtech prováděných v FPU používán rozšířený formát nazývaný extended či temporary. Tento formát je zajímavý tím, že pro uložení FP hodnot používá 80 bitů a je do něho možné beze ztráty přesnosti uložit 64bitové hodnoty typu integer. Osmdesátibitový vektor je rozdělen do třech částí následujícím způsobem:

  • 1 bit pro znaménko
  • 15 bitů pro exponent (BIAS je roven 16383)
  • 64 bitů pro mantisu (maximální hodnota přesahuje 104932)

U tohoto formátu je zajímavá funkce bitu s indexem 63. Podle hodnoty tohoto bitu se rozlišují čísla normalizovaná a nenormalizovaná (tento bit ve skutečnosti nahrazuje implicitně nastavovaný nejvyšší bit mantisy, jak ho známe z předchozích formátů). Matematický koprocesor 8087 sice dokáže pracovat s čísly nenormalizovanými, výsledkem jeho aritmetických operací jsou však vždy hodnoty normalizované. Všechny možnosti, které mohou při ukládání extended FP formátu nastat, jsou přehledně vypsány v následující tabulce:

s-bit exponent mantisa m63 význam
0 0<e<32767 >0 1 normalizované kladné číslo
1 0<e<32767 >0 1 normalizované záporné číslo
0 0<e<32767 >0 0 nenormalizované kladné číslo
1 0<e<32767 >0 0 nenormalizované záporné číslo
0 0 >0 0 denormalizované kladné číslo
1 0 >0 0 denormalizované záporné číslo
0 0 0 x kladná nula
1 0 0 x záporná nula
0 32767 0 x kladné nekonečno
1 32767 0 x záporné nekonečno
0 32767 >0 x NaN – not a number
1 32767 >0 x NaN – not a number

Pro normalizované i nenormalizované hodnoty je možné uloženou hodnotu vyjádřit pomocí vzorce (všimněte si, že bit 63 je umístěn před binární tečkou):

Xextended=(-1)s × 2exp-16383 × m

m=m630+m62-1+m61-2+…+m0-63

5. Plovoucí řádová čárka na ZX Spectru

V této kapitole si stručně přiblížíme FP formát, který byl použit v „kalkulačce“ umístěné v ROM, tj. vlastně primitivního BIOSu osmibitového domácího počítače ZX Spectrum. Operace s touto kalkulačkou byly postavené na zásobníku (stack) – viz seriál o programovacím jazyku Forth. Následují základní informace o použitém FP formátu:

Celkový počet bitů (bytů): 40 (5)
Bitů pro znaménko: 1
Bitů pro exponent: 8
Bitů pro mantisu: 31
BIAS: 128
Přesnost: 9–10 číslic
Maximální hodnota: 1038
Minimální hodnota: –1038
Nejmenší kladná nenulová hodnota: 4×10-39

6. FP formát firmy Borland: real

Firma Borland pro svůj v minulosti známý a populární programovací jazyk Turbo Pascal vytvořila vlastní implementaci FP formátu, který byl nazván real. Tento datový typ byl šestibytový, což nám může z dnešního pohledu připadat nelogické (zarovnání pouze na 16 bitů), na tehdejších platformách se však jednalo o dobrý poměr počet bitů/přesnost/rychlost výpočtu, nehledě na to, že pro přenos výsledků z funkcí se používala trojice registrů a nikoli zásobník. Veškeré výpočty s tímto datovým typem se prováděly na CPU, proto bylo pro počítače s FPU mnohem výhodnější používat pro něj určené datové typy single a double.

Celkový počet bitů (bytů): 46 (6)
Bitů pro znaménko: 1
Bitů pro exponent: 8
Bitů pro mantisu: 39
BIAS: 128
Přesnost: 11–12 číslic
Maximální hodnota: 1,7×1039
Minimální hodnota: 1,7×1039
Nejmenší kladná nenulová hodnota: 2,9×10-39

7. FP formát Minifloat

Formát Minifloat je významný tím, že je implementován v některých grafických procesorech GPU, například na nVidia GeForce FX či Quadro FX3D. Tento formát, někdy (zejména v programovacím jazyku Cg) také nazývaný half či jednoduše fp16, používá pro ukládání FP hodnot pouhých šestnáct bitů, tj. dva byty. Maximální hodnota je rovna 65504 (FFE016=11111­111111000002), minimální hodnota přibližně 2,9×10-8. Předností tohoto formátu je malá bitová šířka (umožňuje paralelní přenos po interních sběrnicích GPU) a také větší rychlost zpracování základních operací, protože pro tak malou bitovou šířku mantisy je možné některé operace „zadrátovat“ a nepočítat pomocí ALU. Také některé iterativní výpočty (sin, cos, sqrt) mohou být provedeny rychleji, než v případě plnohodnotných typů float a single.

Celkový počet bitů (bytů): 16 (2)
Bitů pro znaménko: 1
Bitů pro exponent: 5
Bitů pro mantisu: 10
BIAS: 15
Přesnost: 5–6 číslic
Maximální hodnota: 65504
Minimální hodnota: –65504
Nejmenší kladná nenulová hodnota: 2,9×10-8

8. FP formát Microfloat

Prakticky nejmenším FP formátem, který je ještě možné prakticky použít, je formát nazvaný Microfloat. Tento formát, ve kterém jsou hodnoty uložené na pouhých osmi bitech, tj. jednom bytu, se používá například při ukládání hodnot naměřených z nelineárních čidel, digitálních průběhů apod. Předností je značná úspora paměti a také snazší FP operace, které je možné povětšinou zakódovat do vyhledávacích tabulek (na mikrořadičích do paměti PROM). Nevýhodou je (logicky) malý rozsah i přesnost. Kromě normalizovaných číselných hodnot (nejmenší hodnotou je 1/64) je možné ukládat i hodnoty nenormalizované (zde je nejmenší hodnotou 1/512), přičemž je možné odlišit kladnou a zápornou nulu a samozřejmě i kladné a záporné nekonečno. Základní charakteristika tohoto opravdu minimalistického FP formátu je zobrazena v následující tabulce:

UX DAy - tip 2

Celkový počet bitů (bytů): 8 (1)
Bitů pro znaménko: 1
Bitů pro exponent: 4
Bitů pro mantisu: 3
BIAS: 7
Přesnost: 2–3 číslice
Maximální hodnota: 240
Minimální hodnota: –240
Nejmenší kladná nenulová hodnota: 1/512 (denormalizovaná hodnota)

9. Obsah třetího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu si popíšeme způsob provádění základních aritmetických operací s hodnotami uloženými ve formátu plovoucí řádové binární tečky podle normy IEEE 754. Také se ukážeme, jak je možné implementovat i výpočet složitějších funkcí, například druhé odmocniny, goniometrických funkcí atd. Nezapomeneme ani na velmi významný algoritmus CORDIC, který byl použit v některých matematických koprocesorech.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.