
difftime()は、秒数の差を返すものなのに、なんでdouble型を返す仕様になっているのでしょうか?
double difftime(time_t time1, time_t time0);
関数 difftime() は時刻 time0 から時刻 time1 までの経過時間を double 型で返す。
2 つの時刻の値はカレンダー時間で指定する。カレンダー時間とは紀元 (協定世界時 (UTC) 1970年1月1日 00:00:00) からの経過秒数である。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
「1970年1月1日00:00:00からの経過秒数」ですので「1970年1月1日00:00:00と、2038年1月19日03:14:08の秒数の差」が「秒数が符号付き32ビット整数を越える」と言う可能性があります。
difftimeの仕様が決まった当時「整数は、符号付きで32ビットまで」だったので、もし、符号付き整数で答えを返してしまうと「-2147483648~2147483647秒の差」しか返せません(秒数の差なので、マイナスを返す必要がある事に注意)
これでは「1970年1月1日00:00:00と、2038年1月19日03:14:08の秒数の差」や「2038年1月19日03:14:08と、1970年1月1日00:00:00」を返せません。
当時の「符号付き64ビット整数」が存在しなかった世界で「-2147483648より小さい値」や「2147483647より大きい値」を「数値で返す」には「doubleを使うしかなかった」のです。
なお、古いUnixでは、time_tは「伝統的に符号つき32ビット整数」なので「difftimeに時刻を渡す前にオーバーフローしているので無意味」です。これは「2038年問題」と言われます。
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95 …
現在のUnix系OSでは、time_tは「2038年1月19日03:14:08以降も正しく表現出来る」ので、difftimeは「-2147483648より小さい値」や「2147483647より大きい値」を返します。
符号付き64ビット整数を使っても良かったのですが「符号付き64ビット整数は標準Cの仕様に無い」ので「標準仕様にする為に、使用できなかった」のです。
この回答への補足
くわしい解説をいただきまして、ありがとうございます。
私が勉強した範囲内では、標準Cライブラリは、ANSI/C(1989年)において仕様になったと思うのですが、私が疑問に思ったことは、何でそのときに一緒に検討しておきながら、ANSI/C標準化委員会は、time関数とdifftime関数の返り値の型にあえて違いを設定したのかということです。
time_t time(time_t* tp);
double difftime(time_t time1, time_t time0);
#2さんと#1さんのご回答を読んで、自分なりに考えてみました。
(1)time_t型は、特定の型に限定せずに、汎用性を持てる形にしておきたい
(2)time関数の返り値をtime_t型に設定することについては、time関数の返り値を使用するgmtime等の関数を用意しておけば、time関数を使う上での不都合は特にない
(3)difftime関数の返り値をtime_t型に設定すると、time_t型が整数型でない場合には、difftime関数の返り値をさらに処理する関数が必要になってくるので、difftime関数本来の目的がうしなわれてしまう。むしろdifftime関数については、返り値の型をdouble型にしておけば、2038年問題も回避でき、ミリ秒以下の返り値を持つ実装も可能性が残るから都合がよいだろう。
こんな理解で正しいでしょうか?
No.1
- 回答日時:
> difftime()は、秒数の差を返すものなのに、なんでdouble型を返す仕様になっているのでしょうか?
浮動小数点型でなければ、1秒以下を表現することができません。
また、汎整数型で表現可能な範囲は±2147483647秒しか表現できませんので、狭い範囲の時間しか表現できません。
> 関数 difftime() は時刻 time0 から時刻 time1 までの経過時間を double 型で返す。
> 2 つの時刻の値はカレンダー時間で指定する。カレンダー時間とは紀元 (協定世界時 (UTC) 1970年1月1日 00:00:00) からの経過秒数である。
それはLinux特有の事情です。
time_t型は暦時間を表現するための算術型ですので、long doubleでも_Boolでも、極端な話、複素数型でも構わないのです。また、分解能も秒とはかぎりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- 英語 提示した名言の文の構造について(waste one hour of time) 5 2023/05/20 15:22
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 英語 The waiting time between stages is in the order of 5 2023/05/09 18:46
- 英語 提示したアリストテレスの名言のtooの意味と働きについて 13 2023/08/07 08:58
- Excel(エクセル) Excelで睡眠時間をもとに判定したい 6 2022/08/19 13:47
- 英語 The waiting time between stages is in the order of 2 2023/05/14 09:08
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
C 開放してるのにエラー(doubl...
-
C言語 関数プロトタイプ宣言の...
-
2自由度減衰振動のルンゲクッタ法
-
floating point not loadedとは?
-
Cで3乗根を求める方法
-
浮動小数点の誤差のあわせ方
-
C言語でdouble型の小数点の引き...
-
int とdoubleの比較
-
c言語で、繰り返し文の中で、0....
-
c言語でDFTのプログラムを作成...
-
C言語 質問です。
-
極座標から直交座標に変換
-
doubleは常に%lfとするべきなのか
-
C言語のデバック 領域の二重解...
-
浮動小数点の比較について
-
プログラミングでのテイラー展開
-
Cプログラミングの問題です。ニ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
C言語でdouble型の小数点の引き...
-
difftime()について
-
doubleは常に%lfとするべきなのか
-
C#イベント中の戻り値の設定の...
-
c言語で、繰り返し文の中で、0....
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
c言語のプログラミングについて...
-
バイナリから実数を取得したい...
-
c言語のコンパイルエラー canno...
-
関数におけるif文とreturn文に...
おすすめ情報