• ベストアンサー

浮動小数点の扱い

double型の0以上1未満の数を整数で表現しようとしています。 その法則は360を基準として 0なら整数表現は359 0.999なら整数表現は0 0.5なら整数で表現は180 のようにします。 double d; int i d = 0.5; i = ここまで考えましたが続きはどうしたらいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • txrx
  • ベストアンサー率45% (83/184)
回答No.9

double dlGain ; int iPos = 0 ; dlGain = 1.0 ; dlGain /= 360.0 ; for( ; iPos < 360 ; iPos++ ){ printf("%d = %5.3f\n",iPos,1.0 - ((double)iPos * dlGain)); } とりあえず同じ結果が出てきました。 0 = 1.000 1 = 0.997 2 = 0.994   : 179 = 0.503 180 = 0.500 181 = 0.497   : 358 = 0.006 359 = 0.003 0.997~1.000は、0となります。 条件には、1未満とありますので、1.000は含まれません。 0.5の時は、180 0.00x~0.003は、359となります。 ここで、0.000=1.000と考えています。 また0=360です。 1回転の角度(単位:ディグリー)を0~1未満で表現するのではないでしょうか? 1回転角度なので、先で述べた0=360と0.000=1.000が成立します。 ここで、厳密な0を何処に置くかが問題になります。 数学的には、他の方が書かれている通り、条件に反してしまいますが、プログラム的にはなんとなく条件が成立しますね。

その他の回答 (8)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.8

すみません。 0なら整数表現は0 0.999なら整数表現は359 なら、話がわかるのですが、 どうして、 0なら整数表現は359 0.999なら整数表現は0 なのでしょうか? 又、何故、このような質問をされたのか。(何故double型の0以上1未満の数を整数で360を基準として表現したいのか)ということ自体に非常に興味があります。よろしければ、教えていただけませんでしょうか。

  • uzk
  • ベストアンサー率40% (6/15)
回答No.7

#4の補足の問題ですが、対応付けが質問と逆です。 ○以上□以下なら逆になっても同じ話ですが、 ○以上□未満では逆にすると問題が変わってしまいます。

回答No.6

質問に書いてあるコードの意味が理解できていませんが、指数関数(f(x)=a*e^(b*x)+c)で近似してみました。ちゃんと計算したわけではないので最適値ではありません。 #include <math.h> int henkan(double x) { return 3593000.0*exp(-0.0001*x)-3592640.1; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4の補足について、 「1時間のタイマー」が意味不明ですが… #4の補足のルールと、質問文のルールは基本的に異なります。 それに、このルールでも 23:59が99%って所がおかしいと思いますが…

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#2の補足について double型の0~1未満の数ということなので 0.999が0になる場合 0.999より大きい数の場合どうなるのか指定がありません。 #3の方も答えていられる通り、 「0なら整数表現は359 0.999なら整数表現は0 0.5なら整数で表現は180」 のルールは、線形にならないことは、 見てすぐわかることです。 つまり、一対一で表現できる良い方法がないということです。 >ここまで考えましたが 逆に 一体何を考えたというのでしょう?

ceshkr
質問者

補足

1時間のタイマーをセットした。 23:59なら99% 12:00なら50% 0:00なら0% もしかして 6:00なら?を10分以内に答えられない?

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.3

こういうときは その法則は360を基準として... という”法則”を数式に表現できるかがポイントになります。 この場合の条件では1次関数で表現できないので高次関数もしくは双曲線などになるかと思います。この場合は条件式が3つのため、最高でも2次式までしか計算することができません(それ以上高次の場合は条件がもっと必要)。 適当に二次関数でフィットしてみようと思いましたが、相当に複雑になってしまい計算するのを諦めました(フィットはできますが相当変な関数になります)。 例えば上の”法則”で0.4のときは何になるかなどもっと条件を増やしてもらえれば、どんな関数にフィットすればいいのか分かり何とかなるかもしれません。

ceshkr
質問者

お礼

双曲線じゃなくて対数です。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ルールが変です。

  • uzk
  • ベストアンサー率40% (6/15)
回答No.1

0なら360とか、0.5なら179とかなら出来ますが… "0なら360"でいいなら、 i = (1-d)*360; "0.5なら179"でいいなら、 i = 359 - (int)(d*360);

関連するQ&A