質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3073閲覧

複雑な計算式の簡略化、条件分岐の仕方

bacchi

総合スコア13

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/11/11 08:51

###前提・実現したいこと
Swiftで日付を取得してそれをユリウス日に変換して表示させるプログラムを書いています。

現在のグレゴリオ暦法による西暦年月日からユリウス日(JD)に変換する計算式は以下の通りです。(年をY、月をM、日をDとします)

JD = 〔365.25Y〕 + 〔Y/400〕 - 〔Y/100〕 + 〔30.59(M-2)〕 + D + 1721088.5

ただし、1月のMは13、2月のMは14とし、このときYはY-1とします。
ここで、〔〕内は小数点以下を切り捨て、整数のみをとります。

計算式のところに以下のようなエラーメッセージが出ました。

###発生している問題・エラーメッセージ

Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

###該当のソースコード

Swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 //現在時刻を取得. 10 let myDate: Date = Date() 11 12 //カレンダーを取得. 13 let myCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 14 15 //取得するコンポーネントを決める. 16 let myComponetns = myCalendar.components( 17 [ 18 NSCalendar.Unit.year, 19 NSCalendar.Unit.month, 20 NSCalendar.Unit.day 21 ],from: myDate) 22 23 let Y = myComponetns.year! 24 let M = myComponetns.month! 25 let D = myComponetns.day! 26 27 let JD: Float 28 29 if M > 2 { 30 JD = floor(365.25 * Y + Y / 400 - Y / 100 + 30.59 * (M - 2)) + D + 1721088.5 31 } 32 33 else if M <= 2{ 34 JD = floor(365.25 * (Y - 1) + (Y - 1) / 400 - (Y - 1) / 100 + 30.59 * ((M + 12) - 2)) + D + 1721088.5 35 } 36 37 38// 計算式崩してみた 39/* 40 if M > 2 { 41 let jd = 365.25 * Y + Y / 400 - Y / 100 + 30.59 * (M - 2) 42 let jdf = floor(jd) 43 let JD = jdf + D + 1721088.5 44 } 45 46 else if M <= 2 { 47 let jd = 365.25 * (Y - 1) + (Y - 1) / 400 - (Y - 1) / 100 + 30.59 * ((M + 12) - 2) 48 let jdf = floor(jd) 49 let JD = jdf + D + 1721088.5 50 } 51*/ 52 53// ()つけてみた 54/* 55 if M > 2 { 56 JD = floor((365.25 * Y) + (Y / 400) - (Y / 100) + (30.59 * (M - 2))) + D + 1721088.5 57 } 58 59 else if M <= 2{ 60 JD = floor((365.25 * (Y - 1)) + ((Y - 1) / 400) - ((Y - 1) / 100) + (30.59 * ((M + 12) - 2))) + D + 1721088.5 61 } 62*/ 63 64 print(JD) 65 } 66}

###試したこと
計算式を崩してみたり、()をつけてみたりしましたが、同じエラーが出ました。
どうしてもうまくいかないのでアドバイスお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Swift3.0
Xcode8.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コンパイルエラーは、下記の記事に従って式を分割してみることで解決できるかもしれません。

Swift「Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions」が出た時の対処

また、質問に書かれているコードで気になるのは、

JD = 〔365.25Y〕 + 〔Y/400〕 - 〔Y/100〕 + 〔30.59(M-2)〕 + D + 1721088.5

に対応する式にfloor 関数が1つしか使われていない点です。

元の数式には小数点以下を切り捨てる〔〕が4つあるのですから、そのコードの中にはfloor関数が4つ使われていなければならないはずです。

JD = floor(365.25 * Y + Y / 400 - Y / 100 + 30.59 * (M - 2)) + D + 1721088.5

J1 = floor(365.25 * Y) J2 = floor(Y / 400) J3 = floor(Y / 100) J4 = floor(30.59 * (M - 2)) JD = J1 + J2 + J3 + J4 + D + 1721088.5

というように変更するなどしては、如何でしょうか。
少なくとも、質問のコードのままでは、正しい値になりません。

投稿2016/11/11 09:38

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

もっと崩して下さい。
jdに代入している式なんかは、まだまだcomplexに見えます。

ちなみに、現在のコードだと、

〔〕内は小数点以下を切り捨て、整数のみをとります

の仕様を満たせていないような気がします。

投稿2016/11/11 09:35

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問