トピック
さんりょー Yoshi-Lupin0622

経過時間計算について

経過時間、もしくは残時間を計算するプログラムを組んでいるのですが、どうも誤った値を出してしまいます…。 何が原因なのか分かる方が居たらコメントを頂けると幸いです。
2そうだね
プレイ済み
返信[1]
親投稿
あきと SideBurnsM
10行目で年と月だけを足して比較していますが、年月日時分秒を一つの数値(=秒)に足しこんだ上で差分を取らなければ正しい時間の差は計算できないのではないでしょうか。
1そうだね
プレイ済み
返信[2]
親投稿
さんりょー Yoshi-Lupin0622
オーバーフローしないか心配なので変えたのですが…。やはり秒でまとめた方がいいのでしょうか…。うるう秒投入も本来考慮しなきゃいけませんよね…。
0そうだね
プレイ済み
返信[3]
親投稿
あきと SideBurnsM
うるう秒は無いかと。 60秒60分24時間365日100年全て掛けると31億なので大丈夫では?
1そうだね
プレイ済み
返信[4]
親投稿
さんりょー Yoshi-Lupin0622
なら大丈夫ですね…そうします
0そうだね
プレイ済み
返信[5]
親投稿
あきと SideBurnsM
大ざっぱに「うるう秒はない」と書きましたが、うるう年のように4年に一回一日増えるというような明快なルールに基づいたのとうるう秒は違いますよね。 地球の自転と協定世界時のズレが広がったときにうるう秒を差し込みましょうという風に人間によって管理されているためプログラムには組み込まれていないだろうという意味でした。
3そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
進数変換(時刻は 60進数とか24進数だったりしますね)に浮動小数点数を使うと、たいてい予期しないバグに遭遇します。 特に floor() とか最悪。 例えば ? 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 (0.1を10回足す) は 1 を表示します(数学的にも期待通りな感じ) ところが、 ? floor(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1) は 0 を表示します。 なんとも納得できないと思うけどこれは仕方ないのですね。 なので、進数変換には整数演算のみを使うのがオススメ!!
1そうだね
プレイ済み
返信[7]
親投稿
作りとしては、年月が違っていたら、年月が一致するまで日を足し込んで日に変換して変数ADへ代入して、あとで時に変換。 時刻は秒変換して変数ATに代入して、年月日が違えば1日分加算 あとはHをADとATから、M、SをATから変換(FLOORはDIVを使った方がすっきりするかも) (変数ADが年月違いのときに初期化されなくて2回目からおかしくなるはずなので、TCAL入った段階で初期化したほうがよさげ) 日時変換はほんとややこしいので、比較される日時どうしを計算するのではなく、いったんそれぞれある基準からの秒や日などに変換してから、その値同士で計算して、求まった秒を日時に計算する方法のほうが一般的だったりします。(1日の長さは86400秒固定なのであとで計算できる) どうしても今の方法を使うなら、TCALの計算途中で変数をPRINTして、いろんな日付を渡して動きをチェックしたほうがいかも
1そうだね
プレイ済み
返信[8]
親投稿
ちなみに日付時刻計算は、Excelだと 1899年を基準とした日のカウント(時は浮動小数なので厳密な秒の計算はちょっと怖い) 他のシステムは1970年を基準とした秒(こっちは秒がオーバーフローする2038年問題がある) どちらも、長い期間を計算するのか、秒の精度を期待するのか用途が違うので、どっちが良いというのは用途次第だったりします。 12行目まで年月が同じになるまで日を足してるけど、12行目は AD=AD+NM(SY,ST)-SD+GD-1 だと 開始月の日をさらに足してるので AD=AD-SD-1+GD の、すでに足し込んでいる開始日を引くのと、終了月の日を足すのでいいのかも。
1そうだね
プレイ済み
返信[9]
親投稿
さんりょー Yoshi-Lupin0622
たくさんのアドバイスを頂きありがとうございました!参考にさせていただきます! トピ閉めさせて頂きます。本当にありがとうございました!
0そうだね
プレイ済み