🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

2回答

3981閲覧

float型に値を入れても小数点以下が0になってしまう

mamamamama

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

0クリップ

投稿2021/01/07 22:55

一部情報を公開できないものもあるのですが、以下の情報で何かヒントになることがあれば教えていただきたいです。

C言語の環境で、float型の変数に小数をセットしても小数点以下が0になってしまっています。プログラム自体はエラーになったりせず普通に動いています。原因がさっぱり分からず困ってます。そういうことってあるんでしょうか。

FLT_MINやFLT_MAXを出力してみても0.00になっています。
float.hの中では、きちんと小数の値が定義されてるんですが…。
float.h内の整数の定義についてはきちんと出力されてるので、ヘッダーファイルは読めてると思います。

C

1#include "float.h" 2 3(省略) 4 5 float test1 = 3.4; 6 float test2 = 3.6; 7 8 if (test1 == test2 ) { 9 printf("test = %f test2 = %f", test1, test2 ); 10 } 11 else { 12 printf("success"); 13 } 14

出力結果

test = 3.00 test2 = 3.00

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/01/07 22:58

プログラムを動かすマシン環境は何でしょうか? (組み込み系だと、浮動小数点数関係で特殊な処理が行われる可能性は考えられます)
mamamamama

2021/01/07 23:46

すみません、マシン環境とはどのようにお答えすればいいでしょうか。 組み込み系になると思います。あるボードにファームを書いて動かしています。
thkana

2021/01/07 23:49

printf("%f %f", 3.4, 3.6 ); がどうなるかとか、 for(int i=0; i<sizeof(test1); i++){ printf("%02x ", *((char*)&test1+i)); } がどうなるか、とか知りたくなります。
thkana

2021/01/07 23:53

ますはターゲットCPU名とコンパイラ名称(メーカー)、ですかね。>マシン環境
ozwk

2021/01/08 00:06

> 一部情報を公開できないものもある でしたら、その問題が再現する最小限のコードを書いてください。
jbpb0

2021/01/08 02:27

https://teratail.com/questions/76697 の質問者さんのような、「ネイティブで浮動小数点演算のできない環境向けにコードを書く」状況なのですかね
guest

回答2

0

ベストアンサー

質問中に「この場合は浮動小数点数を正しく表示した」という情報が見当たりません。

「組み込み系になると思います」ということなら、デフォルトでは浮動小数点(float, double)を扱えない開発環境かもしれません。マイコンのメモリは容量が少なく、組込では浮動小数点が必要なケースは少ないので、デフォルトは浮動小数点関係のコードを含めないようにしているのです。開発環境は何か、ターゲットCPUは何か、くらいは明らかにできるのではありませんか。

デフオルトでfloat, double を扱えない環境なら、そもそも浮動小数点を表示できなくて当然です。質問に載せたコードは if の条件判定を経由して表示していますが、簡単に

C

1 float test1 = 3.4; 2 float test2 = 3.6; 3 printf("test = %f test2 = %f", test1, test2 );

として表示するかどうか。私ならそこから疑います。

正確には覚えていませんが、私が数年前に使った小規模マイコンの開発環境がデフォルトでは float, double を扱えなかったと思います。開発環境のマニュアルを調べて、ライブラリだったか、コンパイルオプションだったか、ビルド関連の指定を追加した記憶があります。
つまり、開発環境のドキュメントを調べてみたら、というのが私の第一の回答です。

それと、インクルードしているのが "float.h" なのが疑問です。"float.h" なら、ソースコードのあるフォルダに質問者自身が書いた、ユーザ定義のヘッダファイル、ということになりますがそうですか?

自作したファイルだ、というならそれでも構いませんが、Cの開発環境には同じ名前の float.h が(ユーザ定義ではなく)標準ヘッダファイルとして最初から別のフォルダに用意されているはずです。それは

C

1#include <float.h>

とインクルードするものです。
同様に、printf() を使うのであれば

C

1#include <stdio.h>

も必要なはずですが、質問者のコードにこれらは示されていません。その辺りの事情を説明するか、もしくはインクルードしてやり直す必要があるでしょう。
表示がおかしいのは <stdio.h> をインクルードしていないから、という可能性も考えられます。これは第二の回答です。

投稿2021/01/08 04:49

rubato6809

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示のコードではifの内容が実行されることはありえません。
ソースコードを取り違えてるとか、コンパイルがなされてないとか言うことはないでしょうか。

投稿2021/01/07 23:14

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mamamamama

2021/01/07 23:48

何度も確認しているのですが、コードは取り違えていないと思います。 適当な文字入れたりしてコンパイル時にエラーになってるので。 コンパイルも全てクリーンにしてからやりなおしたりもしていますが…。 そのあたりもう一度確認してみます。
y_waiwai

2021/01/07 23:51

もしかしたら、提示されてない #include "float.h" で余計な定義されてるってオチでしょうか。 この行を削除してやってみれば。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問