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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

416閲覧

C++についてで式が変な挙動?をとります助けてください; ;

aruzen-weed

総合スコア6

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/14 08:55

ホイールの回転量によって拡大縮小をさせたいのですが

学生です、C++でグラフ作成ソフトを趣味(勉強)で作っていたのですが
グラフの拡大縮小機能を実装したところ、

縮小(0.0001倍を越えたところから)からまた拡大すると0.0001が残ります

該当のソースコード

C++

1if (Mouse::Wheel() < 0) 2 y_mag_box.text = Format(y = my::parse(y_mag_box.text) + Mouse::Wheel() * pow(10, static_cast<int>(log10(y - pow(10, log10(y) - 1)) - 1))); 3 if (Mouse::Wheel() > 0) 4 y_mag_box.text = Format(y = my::parse(y_mag_box.text) + Mouse::Wheel() * pow(10, static_cast<int>(log10(y)) - 1));

色々やってみましたがうまくいかずにこのゴチャっとしたコードです。
語彙力がなく文面だけでは、伝えられそうにないので動画を載っけます、Youtube

捕捉

環境は、VisualStudio2019で
OpenSiv3Dをつかって描画しています

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

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

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

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

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

guest

回答2

0

丸め誤差の影響だということは言えますが
具体的な計算方法は試していないのですみません
ただ簡単に思いつく解決する方法としては
今 1倍から0.0001倍であるところを
10000倍から1倍へと変更してはいかかでしょうか
整数型の演算となるのでうまくいくかもしれません

投稿2020/02/14 10:06

Sepi

総合スコア36

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

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

aruzen-weed

2020/02/14 10:22

有難うございます、知識不足で丸め誤差と言う、実際の計算結果に誤差が出ることを知らなかったので勉強になりました。 小数点の位置と整数値で倍率を管理して、それを今までtextと倍率を同時に操作してたところを、Stringに直してから読み込もうかと思います
guest

0

ベストアンサー

浮動小数点における誤差です
基本的に浮動小数点を使う以上、どうにもなりません

一番かんたんな対応方法は、ホイールの値をintで管理して、
実際に使う値に変換するf(x)を作成することです

int x = 0; if (Mouse::Wheel() < 0 )x--; if (0 < Mouse::Wheel())x++; float y = f(x);

投稿2020/02/14 10:04

編集2020/02/14 10:05
izmktr

総合スコア2856

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

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

aruzen-weed

2020/02/14 10:30

丁寧にありがとうございます コードパクろうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問