Last Update 2021/10/24
-Wfloat-conversion
実数値の精度を下げる暗黙の変換に関する警告
テスト概要
オプション無し、-Wfloat-conversion、-Wconversionの各オプションを使用した際の警告出力例
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
使用ファイル
sample.c
#include <stdio.h>
int main(void)
{
double d1 = 1.234567E-45;
double d2 = 1.234567E+00;
double x1, x2;
float f1, f2;
int n1, n2;
x1 = d1;
x2 = d2;
/* 倍精度浮動小数点型を単精度浮動小数点型へ代入 */
f1 = d1;
f2 = d2;
/* 倍精度浮動小数点型を整数型へ代入 */
n1 = d1;
n2 = d2;
printf("d1 = %E\nx1 = %E\nf1 = %E\nn1 = %E\n\n", d1, x1, f1, (double)n1);
printf("d2 = %E\nx2 = %E\nf2 = %E\nn2 = %E\n", d2, x2, f2, (double)n2);
return 0;
}
動作テスト
オプション無しでコンパイルを実行
$ gcc sample.c 警告無し
$ ./a.out
d1 = 1.234567E-45
x1 = 1.234567E-45
f1 = 1.401298E-45
n1 = 0.000000E+00
d2 = 1.234567E+00
x2 = 1.234567E+00
f2 = 1.234567E+00
n2 = 1.000000E+00
$
-Wfloat-conversionオプションを指定してコンパイルを実行
$ gcc -Wfloat-conversion sample.c
sample.c: In function ‘main’:
sample.c:15:7: warning: conversion from ‘double’ to ‘float’ may change value [-Wfloat-conversion]
f1 = d1;
^~
sample.c:16:7: warning: conversion from ‘double’ to ‘float’ may change value [-Wfloat-conversion]
f2 = d2;
^~
sample.c:19:7: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
n1 = d1;
^~
sample.c:20:7: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
n2 = d2;
^~
$ doubleからfloatおよびintへの変換で値が変わる可能性がある事への警告
-Wconversionオプションを指定してコンパイルを実行
$ gcc -Wconversion sample.c
sample.c: In function ‘main’:
sample.c:15:7: warning: conversion from ‘double’ to ‘float’ may change value [-Wfloat-conversion]
f1 = d1;
^~
sample.c:16:7: warning: conversion from ‘double’ to ‘float’ may change value [-Wfloat-conversion]
f2 = d2;
^~
sample.c:19:7: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
n1 = d1;
^~
sample.c:20:7: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
n2 = d2;
^~
$ -Wfloat-conversionオプションは-Wconversionでも有効となる