est possible de mémoriser un double réseau à un tableau à flotteur en toute sécurité? p>
5 Réponses :
dépend de ce que vous voulez. Les valeurs ne seront certainement pas préservées. Si vous en avez besoin, utilisez std :: copier code>.
#include <algorithm>
int main()
{
double a[] = {1.618, 3.1416, 2.7, 0.707, 1.0};
float b[5];
std::copy(a, a + 5, b);
}
Cela ne fonctionne pas (pour moi sur VS2017) puisque le compilateur ne permet pas la perte implicite de précision de double à flotter via std :: copie code>. Je devais utiliser la fonction
std :: transformer code> à la place, à l'aide d'un Lamda. Cela est également plus clair montrant qu'une perte de précision explicite est réellement en cours.
@Azp il semble que vous avez choisi les options du compilateur pour le faire rejeter le code valide. (Ou il y a un bug de compilateur)
@ M.m bien, la perte de précision implicite est un peu dangereuse - en fonction de ce que vous travaillez - et l'utilisation d'un niveau d'avertissement de 4 entraînera un avertissement du compilateur. Depuis que j'utilise "Traitement des avertissements comme erreurs", cela ne compilera pas. "Code valide" dans ce sens ne signifie pas «bon code».
Le problème est qu'il n'ya aucune garantie que la représentation binaire du compilateur d'un Vous êtes destiné à comportement non défini em> lorsque le type de source ne correspond pas au type de destination, tel que la copie de double code> est la représentation équivalente d'un
float code>. Pour utiliser
memcpy code> pour les types multi-octets est que la représentation sous-jacente doit être la même (même disposition). Vous pouvez copier en toute sécurité
float code> sur
float code>,
int code> à
int code> et
double code> à < Code> Double Code>. p>
long code> à
char code> ou < Code> float code> à
double code>. La fonction
memcpy code> ne fait aucune conversion ni effectuer de promotions. Il suffit de copie. P>
En général - NO. p>
Dans des cas spécifiques, sur une plate-forme donnée, la représentation de float code> et
double code> peut être identique et la copie réussira. Mais cela ne fait aucun sens pratique. P>
Comme beaucoup d'autres ont répondu, en utilisant Types de points flottants forts> p>
utiliser à la place, je recommande d'utiliser Utiliser le memcpy code> ne fonctionne pas car les deux types sont (généralement) de taille différente. Veuillez consulter plus d'informations sur http://fr.cppreference.com/w/cpp/language/ Types , ou plus spécifiquement:
std :: copier code> vous donnera un avertissement de compilateur (au moins pour moi sur le compilateur VS2015 / VS2017) car le compilateur ne permet pas la perte de précision implicite de la double Flotter via STD :: Copie, sans avertir le développeur à ce sujet. Et si vous avez le
Traitement des avertissements comme erreurs code> Set d'indicateur, vous obtiendrez une erreur de compilateur. P>
STD :: Transformez la fonction CODE>, associée à une LAMDA effectuant la distribution spécifique. Cela est également plus clair montrant qu'une perte de précision explicite est réellement en cours. P>
Votre problème est que cela "Traiter des avertissements comme des erreurs" option absurde. Bien sûr, transformer code> fonctionne, est plus explicite et peut donc être préféré dans certaines bases de code, mais "ne fonctionne pas" pour
copie code> est clairement faux.
@Marcglisse, vrai, je vais changer ce libellé. Je ne suis pas d'accord avec l'option "non-personne" cependant.
memcpy code> est le type agnostique (voit simplement les octets) et ne peut pas faire de type conversion de type. Il suffit d'utiliser
std :: transformer code> comme @AZP a dit:
Dépend de ce que vous entendez en toute sécurité.