ページ 11

nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 14:42
by jun039
いつも利用させて頂いております。

早速ですが、、、、nsecをsecへ変換する場合に、どちらがいいのかを
相談したいと思います。

 A : sec = nsec * 0.000000001
 B : sec = nsec / 1000000000

結果としては、どちらでも同じ結果になると思うのですが、
皆様が使うとしたら、どちらの方法で行いますか?
または、他の手段を使われる方もいるのでしょうか??

できれば理由とともに教えていただけると助かります。

申し訳ありませんが、よろしくお願いします。

Re: nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 15:35
by usao
オフトピック
sec = nsec * 1.0e-9;
って書くかな.理由は見やすいから.

Re: nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 18:36
by ISLe()
個人的には、この用途での浮動小数点数はデメリットしか浮かばないのでBですね。

Re: nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 18:54
by h2so5
jun039 さんが書きました: 結果としては、どちらでも同じ結果になると思うのですが、
本当にそうでしょうか?

コード:

#include <stdio.h>
int main() {
    double nsec = 3.0;
    if ((nsec * 0.000000001) == (nsec / 1000000000.0))
        puts("Equal");
    else 
    	puts("Not Equal");
    return 0;
}

Re: nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 20:51
by softya(ソフト屋)
私はlong longで処理するとか、そもそも変換しない(表示を工夫)とかdoubleは介在させません。

Re: nsecをsecへ変換する方法

Posted: 2014年6月19日(木) 22:33
by jun039
皆様回答してくださりありがとうございます!!

usao様>
  確かに、nsecだと0がいくつ必要なのかがわかりにくくなるので、
 その方法はいいですね!

ISLe()様>
  浮動小数点は極力避けるべきなのですね。
  演算としては、整数演算のほうが効率よくみえますので。

h2so5様>
  確かに記載していただいたコードを実行するとNot Equalになりますね。
  でも、それぞれをprintfで出力してみると同じものが表示されるんです。
  内部では異なるのかな?

コード:

	double nsec = 3.0;
	printf("%.15f, %.15f\n", (nsec * 0.000000001), (nsec / 1000000000.0));
softya(ソフト屋) 様>
  可能な限りは浮動小数点を避けるコードが良いということですね。


上記を参考に、対応したいと思います。(浮動小数点はしない方向で検討してみます)
非常に勉強になりました!

今後共、よろしくお願いします。