2009-08-18 14 views
4

シンプルな質問ですが、どのようにして正確にミリ秒単位でsuccintlyミリ秒に変換できますか? Cでミリ秒を秒単位に変換

  • Iましたこの小さなサブセットの-Cコンパイラではありません浮動小数点サポート
  • 私がダウンして最も近い秒に丸め秒(1-499msラウンドを必要とする、500-: は、2つの制約があります999msは切り上げられます。

    int mseconds = 1600; // should be converted to 2 seconds 
    int msec = 23487; // should be converted to 23 seconds 
    
+0

どのようにして1500と2500を丸めますか(ヒント:いくつかの言語でアルゴリズムを選択させるhttp://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx) –

答えて

25

これは

を動作するはずです)負の値を気にする必要はありません。
int sec = ((msec + 500)/1000); 
+0

それは最もクリーンな方法です。私は通常、それを考えるのに1.6秒以上かかるときにそれを行います;-) – Guss

+3

これは、次のことを前提としています:ネクタイの場合、ゼロから切り離されています(最も近い偶数ではなく)。丸い負の数値... –

+0

一般的には、整数を四捨五入で除算するには、除算前に被除数の半分を加算します。ローランドの注意点が適用されます。 –

4
int seconds = msec/1000; 
if (msec % 1000 > 500) 
    seconds++; 
+0

彼は明示的に丸めが必要でした。 –

+0

あなたは人々がdownvoteするのが速すぎる:)私は丸めが必要であることを実現するために投稿した後、私は20秒後に丸め部品を追加し、その時までに私は2 downvotesを得ました:) – qrdl

1

これらの行に何かがありますか?まず

secs = mseconds/1000 + (mseconds % 1000 >= 500 ? 1 : 0); 
+0

私はChiの答えが気に入っています。 –

+3

あなたの答えの下に署名を入れないでください。これはフォーラムではありません。 – OregonGhost

+0

私はそれのハングアップを得ている、歓声。 –

4

私は、x86上のテストの後、この答えを書きたくなかったが、SPARC Solaris上でのテストでは、それは「明白な解決策」と比較して、パフォーマンスゲインを持っていた示したので、多分それは誰かに有用であろう。私はHacker's Delightという書籍に付随するa PDFから取り上げました。ここではそれが行く:

unsigned msec2sec(unsigned n) { 
    unsigned q, r, t; 
    n = n + 500; 
    t = (n >> 7) + (n >> 8) + (n >> 12); 
    q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14); 
    q = q >> 9; 
    r = n - q*1000; 
    return q + ((r + 24) >> 10); 
} 

と対照的に:

unsigned msec2sec_obvious(unsigned n) { 
    return (n + 500)/1000; 
} 

x86では「明白なアルゴリズムは」その後の上位32ビットをつかん続い274877907によって長い乗算を、500を追加しに変換しますedxと6ビット右シフト - それは手の上にこのコードを打つ(〜5倍のパフォーマンスの差)。

しかし、Solaris/sparcでは、 "明らか"が.udivの呼び出しに変換されます。これは、すべて別の方向で〜2.5倍の性能差を与えることが判明しています。

関連する問題