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

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

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

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

Q&A

解決済

4回答

1440閲覧

C++でmath.hを使わずに入力した値xについてsin(x),cos(x)を求めるプログラム

doragooooon123

総合スコア1

C++

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

0グッド

0クリップ

投稿2022/01/09 07:47

前提・実現したいこと

C++でmath.hを使わずに入力した値xについてsin(x),cos(x)を求めるプログラム

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

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

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

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

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

y_waiwai

2022/01/09 07:55

で、しつもんはなんでしょうか
episteme

2022/01/09 08:03

マクローリン展開でもすりゃいぃんじゃないかしらね。
ikadzuchi

2022/01/10 06:23

入出力の形式と要求精度を明示して下さい。 あるいは利用目的があるならそれを明示してください。
fana

2022/01/10 08:56

とりあえず「sin 実装」とか何とかそれっぽい言葉で検索してみてはどうですか.
guest

回答4

0

C++

1double sine(double x) 2{ 3 __asm{ 4 fld qword [x] 5 fsin 6 fstp qword [x] 7 } 8 return x; 9}

x86限定ですが、標準関数を使わない中では多分これが一番簡単だと思います(フラグ)。

投稿2022/01/09 22:50

編集2022/01/09 22:56
majiponi

総合スコア1722

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

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

0

math.h の代わりに cmath を使えばよいのでは?
または extern "C" double sin(double), cos(double); と書くとか。

追記

C++

1#include <iostream> 2 3const double pi = 3.141592653589793238; 4 5double sin_(double x) 6{ 7 double t = x, y = x; 8 for (int i = 3; i < 22; i += 2) y += t *= x * x / ((i-1) * -i); 9 return y; 10} 11 12double cos_(double x) { return sin_(pi/2 - x); } 13 14int main() 15{ 16 std::fixed(std::cout); 17 for (int i = 0; i <= 90; i += 15) { 18 double x = pi / 180 * i; 19 std::cout << i << " " << sin_(x) << " " << cos_(x) << '\n'; 20 } 21}

実行結果

text

10 0.000000 1.000000 215 0.258819 0.965926 330 0.500000 0.866025 445 0.707107 0.707107 560 0.866025 0.500000 675 0.965926 0.258819 790 1.000000 0.000000

追記2
このコードが完璧なものだとは思わないでください。

x が小さい場合、ループを 10回まわる必要はありません。

x の範囲は [0, pi/2] を想定しています。
もっとちゃんと言うと、sin_ は [-pi/2, pi]、cos_ は [0, pi] です。
だから、x がその範囲にない時は修正しないと精度が悪くなります。

では、どのように修正すればいいか分かりますか?

投稿2022/01/09 12:45

編集2022/01/10 09:01
kazuma-s

総合スコア8224

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

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

episteme

2022/01/09 13:00

とんちwww 「標準関数 sin/cos を使わずに」とは書いてないからねぇ♪
guest

0

ベストアンサー

Windowsでは動きませんが。

C

1#include <stdio.h> 2#include <stdlib.h> 3double sin(double x){ 4 char cmd[50]; 5 double y; 6 FILE *f; 7 sprintf(cmd,"echo 's(%f)' | bc -l",x); 8 if(!(f=popen(cmd,"r"))){ 9 fprintf(stderr,"bc のエラー\n"); 10 exit(1); 11 } 12 if(fscanf(f,"%lf",&y)!=1){ 13 fprintf(stderr,"bc のエラー\n"); 14 exit(1); 15 } 16 pclose(f); 17 return y; 18}

投稿2022/01/09 14:20

otn

総合スコア85901

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

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

0

メモリ上に三角関数表を持っておくのが速いです。

投稿2022/01/09 08:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YT0014

2022/01/09 16:13

math.hで定義されているsin(x),cos(x)の引数xはdoubleなのですが、どのうようにして表を作成されるおつもりでしょうか?
退会済みユーザー

退会済みユーザー

2022/01/09 23:02

@YT0014 ?何を勘違いしているのか知りませんが、私は表を作成するつもりはありません。作るのは質問者です。
退会済みユーザー

退会済みユーザー

2022/01/09 23:24

これにマイナス票つくとかクソだな。
Zuishin

2022/01/09 23:42

えっと、その表ってメモリに収まりますか? 誰が入力するんですか?
maisumakun

2022/01/10 00:51 編集

> 私は表を作成するつもりはありません。作るのは質問者です。 どの程度のマシン環境で実用することを想定していますでしょうか?
退会済みユーザー

退会済みユーザー

2022/01/10 01:14 編集

@Zuishin 64ビットの出力値を2^64通りの入力に対して格納するから64×2^64ビット=約150000PB。スパコン富岳のメモリが4.85PiB、これがムーアの法則で2年毎に2倍になるとすれば30年後くらいにはできるようになる。入力は質問者がやる。
Zuishin

2022/01/10 01:20

で、低評価の理由がわからないんですか?
退会済みユーザー

退会済みユーザー

2022/01/10 01:30

ワカンネ〜
fana

2022/01/10 06:12

そもそもがどの程度の要求精度な話なのかが不明ですが… それ次第では,0~45度の角度範囲を相応に(満足いくまで)細かくサンプリングした角度群についてのcos(or sin)値だけを保持しといて,間の値に関しては適当な補間でごまかすみたいな方法は考えられるのでは.
ikadzuchi

2022/01/10 06:17

要求精度も分からない段階からこれに低評価が付くのは理解できませんね。
Zuishin

2022/01/10 06:19

「求め方」を聞く質問で、求めた結果をどこに保存しておくかという話ではないんですよ。
Zuishin

2022/01/10 06:50 編集

「どうやってお金を稼いだらいいですか」という質問に「銀行から降ろすのが一番早い」と答える人がいたらちょっとおかしい人扱いされますよね。 まず口座にお金がないから聞いているので。
episteme

2022/01/10 08:10

↑それはどうなんでしょう。 six/cos をライブラリに持たない(たとえば組み込みとかの)処理系なら 適切な制度のsin/cos表を与えておくってのは十分にアリな策ではないかと。
Zuishin

2022/01/10 08:15

だったらそういう前提の記述がありますよね 私には課題にしか見えません。
episteme

2022/01/10 08:19

うむ...質問者の意図がわからんとなんとも。
Zuishin

2022/01/10 08:28

私はこの回答に低評価していません。 しかし、問題を解決するに足る情報が記述されているようには見えず、低評価に値するとは思っています。 詳細を聞くと、現在のコンピューターの持つ機能を超えるものを要求しているということなので、到底実用に足るものではないとも思っています。 この低評価がどういう理由でつけられたのかは私は知りませんが、役に立たない回答に対する評価として妥当だと思います。
YT0014

2022/01/10 09:10

低評価した者の責務として、私の低評価理由を。 前提として、math.hの代用処理の方法を求めている質問だと解釈しました。 その為、引数は、ラジアン指定のdouble値が必要。表引きするとして、どのような表を用意して、どのように利用するのかが不明では、回答として不十分だと判断し、低評価とともに、補足を求めてコメントを入れました。 補足や修正をあれば、当然、再評価の予定でしたが、言及すら拒否されましたので、そのままとさせていただいております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問