前提・実現したいこと
C++でmath.hを使わずに入力した値xについてsin(x),cos(x)を求めるプログラム
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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総合スコア8224
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
総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
メモリ上に三角関数表を持っておくのが速いです。
投稿2022/01/09 08:13
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/09 16:13
退会済みユーザー
2022/01/09 23:02
退会済みユーザー
2022/01/09 23:24
2022/01/09 23:42
2022/01/10 00:51 編集
退会済みユーザー
2022/01/10 01:14 編集
2022/01/10 01:20
退会済みユーザー
2022/01/10 01:30
2022/01/10 06:12
2022/01/10 06:17
2022/01/10 06:19
2022/01/10 06:50 編集
2022/01/10 08:10
2022/01/10 08:15
2022/01/10 08:19
2022/01/10 08:28
2022/01/10 09:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。