Attualmente sto lavorando a un progetto C++ che esegue calcoli numerici. La vasta, vasta maggioranza del codice utilizza valori di virgola mobile a precisione singola e funziona perfettamente bene con quello. Per questo motivo utilizzo i flag del compilatore per rendere i valori letterali in virgola mobile di base a precisione singola invece della doppia precisione, che è l'impostazione predefinita. Trovo che ciò renda le espressioni più facili da leggere e non devo preoccuparmi di dimenticare una "f" da qualche parte. Tuttavia, ogni tanto ho bisogno della precisione extra offerta da calcoli a doppia precisione e la mia domanda è come riesca a ottenere una doppia precisione letterale in tale espressione. Ogni modo che ho provato finora memorizza il valore in una singola variabile di precisione e converte il valore troncato in un doppio valore di precisione. Non quello che voglio.Esiste un suffisso letterale in virgola mobile in C++ per fare una precisione doppia al numero?
Alcuni metodi che ho provato fino ad ora sono riportati di seguito.
#include <iostream>
int main()
{
std::cout << sizeof(1.0E200) << std::endl;
std::cout << 1.0E200 << std::endl;
std::cout << sizeof(1.0E200L) << std::endl;
std::cout << 1.0E200L << std::endl;
std::cout << sizeof(double(1.0E200)) << std::endl;
std::cout << double(1.0E200) << std::endl;
std::cout << sizeof(static_cast<double>(1.0E200)) << std::endl;
std::cout << static_cast<double>(1.0E200) << std::endl;
return 0;
}
Una corsa con costanti di precisione singola fornisce i seguenti risultati.
~/path$ g++ test.cpp -fsingle-precision-constant && ./a.out
test.cpp:6:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:7:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:12:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:13:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:15:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:16:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
4
inf
16
1e+200
8
inf
8
inf
rimane inteso che gli 8 byte forniti dai due ultimi casi dovrebbe essere sufficiente a contenere 1.0E200, una teoria sostenuta dalla seguente output, dove lo stesso programma viene compilato senza -fsingle precisione costante .
~/path$ g++ test.cpp && ./a.out
8
1e+200
16
1e+200
8
1e+200
8
1e+200
Una possibile soluzione suggerita dai suddetti esempi è di usare precisione quadrupla letterali punto ovunque originariamente destinato ad utilizzare doppia precisione, e cast a doppia precisione se richiesto da biblioteche e tale galleggiante. Tuttavia, questo sembra un po 'dispendioso.
Cos'altro posso fare?
Soluzioni collaudate, ma 'strtod ("1e + 200") 'potrebbe essere ottimizzato per la costante a virgola mobile a doppia precesione desiderata. –
Non so, sembra un po 'come se stessi creando un problema. Perché non lasciarlo così com'è e aggiungere 'f' a tutto ciò che non ha bisogno della doppia precisione? – Mysticial
Puoi mettere le tue doppie costanti in un file separato e compilarlo senza il flag '-fsingle-precision-constant'. –