する質問をすることでしか得られない、回答やアドバイスがある。5floatをintへ変換する際の挙動の違いについてfloatをintに変換する下記の2つのメソッドの挙動がことなります。(result);}test1とtest2のメソッドそれぞれに引数に「3.6f」を与えると、下記の結果になります。36なぜ、test1の結果が35になるのか欲しい結果はtest2の36なのですが、なぜ、test1の結果が35になるのでしょうか?よろしくお願いいたします。attachmentクリップ0気になる質問をクリップするクリップした質問は、後からいつでもマイページで確認できます。クリップした質問に回答があった際、通知やメールを受け取ることができます。自分も答えを知りたい質問者以外のユーザにも役立つ評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。質問の評価を上げたことを取り消します低評価-評価を下げられる数の上限に達しました評価を下げることができません1日5回まで評価を下げられます1日に1ユーザに対して2回まで評価を下げられます質問の評価を下げるteratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。コメントをしてください。送信する質問の評価を下げる機能の利用条件この機能を利用するためには、以下の事項を行う必要があります。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。19:18早速のご回答ありがとうございます。doubleの計算結果キャストすると、35になるということでしょうか?下記のソースコードを試したのですが、36となりました。tmp_d;よろしくお願いいたします。ご回答ありがとうございます。下記のソースコードを試したのですが、36となりました。編集https://www.jpcert.or.jp/sc-rules/c-flp00-c.html早い話が、計算結果はdoubleといっても、内部的にはdoubleと違う精度で保持していて、それを元に計算し、キャストしているという話。計算結果をdoubleでキャストしても結果が違うということですね。早い話が、計算結果はdoubleといっても、内部的にはdoubleと違う精度で保持していて、それを元に計算し、キャストしているという話。計算結果をdoubleでキャストしても結果が違うということですね。20:18ご説明ありがとうございます。UNIT;としたところ、35.99999の結果になりました。キャストの際に、この結果の少数点が切り捨てされているという事ですね。新たな疑問がわきましたが、それは新たに質問を立てさせて頂こうと思います。(計算に使う数値がリテラルか変数かで結果が異なる)ありがとうございました。ご説明ありがとうございます。したところ、35.99999の結果になりました。キャストの際に、この結果の少数点が切り捨てされているという事ですね。新たな疑問がわきましたが、それは新たに質問を立てさせて頂こうと思います。ありがとうございました。キャンセル完了するlink+1こんにちは。test1はdoubleを直接intへ変換してます。test2はdoubleを一旦floatへ変換後intへ変換してます。num/UNITの結果が3.5999999...になる処理系の場合、double→float変換時に四捨五入されると、そのような挙動になりそうです。msvcでやってみましたが全て両者とも36になりました。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。20:22ご回答ありがとうございます。動作確認までして頂きありがとうございました。処理系によっても結果が異なるんですね。当方は、VisualStudioで動作確認しており、3.5999999...となっておりました。ご回答ありがとうございます。動作確認までして頂きありがとうございました。処理系によっても結果が異なるんですね。当方は、VisualStudioで動作確認しており、3.5999999...となっておりました。msvcでやってみましたが全て両者とも36になりました。Studioのバージョンやコンパイルオプションによって結果が異なる可能性がありますよ。いつからかは忘れましたが、VC++では浮動小数点演算で既定でSSE(またはその上位版)の命令を使うようになったので、それ以前と比べると同じコードでも微妙に計算結果が変わることがあります。試しに、コンパイルオプション「拡張命令セットを有効にする」を「拡張命令なし(/arch:IA32)」に変更してご質問のコードを実行してみたところ、35と36になりました。msvcでやってみましたが全て両者とも36になりました。Studioのバージョンやコンパイルオプションによって結果が異なる可能性がありますよ。いつからかは忘れましたが、VC++では浮動小数点演算で既定でSSE(またはその上位版)の命令を使うようになったので、それ以前と比べると同じコードでも微妙に計算結果が変わることがあります。試しに、コンパイルオプション「拡張命令セットを有効にする」を「拡張命令なし(/arch:IA32)」に変更してご質問のコードを実行してみたところ、35と36になりました。01:40catsforepawさん。フォローありがとうございます。catsforepawさん。フォローありがとうございます。FPU命令とSSE2命令の演算精度差に起因している可能性が高いですね。doubleは64bitで演算します。FPU命令とSSE2命令の演算精度差に起因している可能性が高いですね。doubleは64bitで演算します。https://wandbox.org/permlink/0lKWyCi29m2BtXvVキャンセル完了するlink0除算のときに丸め誤差で35.999999...になってるのでしょう。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。20:20ご回答ありがとうございます。doubleに結果を入れたところ、おっしゃる通り35.999999...となっておりました。ご回答ありがとうございます。35.999999...となっておりました。キャンセル完了するlink0投稿間違いです。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。頂いたご意見への回答は行っておりません。