3

ねえ、いくつかのカテゴリに取り組んでいると、奇妙な問題に遭遇しました。基本的に電卓クラスを拡張して、いくつかのトリガー メソッドを追加しています。戻り値で sin メソッドを次の形式で呼び出すと、間違った値が返されます。ダブル。メソッドに 100.7 の値を送信すると、0.168231 が返されます。正しい値は = 0.939693 である必要があります。

コードはこちらです。プロジェクト全体へのリンクもここに添付しています。

(ありがとう)

http://files.me.com/knyck2/svpfd4

//
//  Calculator_trig.m
//  11.4_calculator_trig
//
//  Created by Nicholas Iannone on 1/6/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "Calculator_trig.h"
#import <math.h>

@implementation Calculator (Trigonometry)

-(double) sin
{
 double result;

 result =   (double) sin (accumulator);

 return result;

}
-(double) cos
{
 double result;

 result =  cos ( accumulator);

 return result;
}
-(double) tan
{
 double result;

 result =  tan ( accumulator);

 return result;
}

@end

    #import "Calculator.h"


@implementation Calculator
-(void) setAccumulator: (double) value
{
 accumulator = value;
}

-(void) clear
{
 accumulator = 0;
}

-(double) accumulator
{
 return accumulator;
}

-(double) memoryClear
{
 memory = 0;
 NSLog(@"memory has been cleared");
 return accumulator;
}

-(double) memoryStore
{
 memory = accumulator;
 NSLog(@"memory has been set to %g", memory);
 return accumulator;
}

-(double) memoryRecall
{
 accumulator = memory;
 NSLog(@"accumulator has been set to %g", accumulator);
 return accumulator;
}

-(double) memoryAdd
{
 memory += accumulator;
 NSLog(@"accumulator: %g has been added to memory, memory is now %g", accumulator, memory);
 return accumulator;
}

-(double) memorySubtract
{
 memory -= accumulator;
 NSLog(@"accumulator: %g has been subtracted from memory, memory is now %g", accumulator, memory);
 return accumulator;
}

-(double) add: (double) value
{
 accumulator += value;
 return accumulator;
}

-(double) subtract: (double) value
{
 accumulator -= value;
 return accumulator;
}

-(double) multiply: (double) value
{
 accumulator *= value;
 return accumulator;
}

-(double) divide: (double) value
{
 accumulator /= value;
 return accumulator;
}

-(double) changeSign
{
 accumulator = -accumulator; 
 return accumulator;
}

-(double) reciprocal
{
 accumulator = 1 / accumulator;
 return accumulator;
}

-(double) xSquared
{
 accumulator *= accumulator;
 return accumulator;
}
@end

    #import <Foundation/Foundation.h>
#import "Calculator.h"
#import "Calculator_trig.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Calculator *myCalc = [[Calculator alloc] init];

 double a = 0;

 [myCalc setAccumulator: 100.70];
 a = [myCalc sin];

 NSLog(@" sin of accumulator = %f", a);

 [myCalc release];
    [pool drain];
    return 0;
}
4

5 に答える 5

12

あなたは 100.7 ラジアンの sin を計算しており、与えられた答えは正しいものです。

于 2010-01-07T03:48:12.540 に答える
10

ラジアンを期待しています。必要な答えを得るには、まず度をラジアンに変換します。

// [radians] = [degrees] * [pi]/180
double theta = 100.7 * M_PI/180;

// sin(1.757 radians) == ~0.98
double result = sin(theta);
于 2010-01-07T03:52:50.203 に答える
5

ラジアンを期待しています

于 2010-01-07T03:47:33.613 に答える
1

Googleによると、答えは正しいです。Google はラジアンを想定していることに注意してください。

http://www.google.com/search?hl=ja&q=sin+of+100.7

于 2010-01-07T03:48:54.440 に答える
0

sin 関数はラジアンを期待しています。度を取得したい場合は、度をラジアンに変換する必要があります。

どうやってそうするのですか?

単純。

円には 360 度あります。どのくらいのラジアンがありますか?

ラジアンは、角度の前の円弧の長さを半径で割った比率として定義されます。

したがって、完全な円の場合、円弧の長さは単に円の円周です。

円の全周は何ですか.

π は、円周と直径の比として定義されます。

直径とは?

さて、直径は半径の2倍です。基本的に直径は、円の中心を通り、線が円と交わったところで終わる線です。半径は、中心から始まり円で終わる線です。

そう

円の円周は π * 直径 = π * 2 * 半径 = 半径 2π です。これは 2πr に短縮されます。ここで、r は半径です。

では、円にはいくつのラジアンがありますか?

簡単

円周を半径で割ります。多田君は 2πr/r=2π を得た。

そして、その 2π は 360 度に相当します。

では、次数がわかっている場合、ラジアンはどのようにしてわかるのでしょうか?

簡単に言うと、2π を掛けて 360 で割ります。

したがって、全体に 2π/360=π/180 を掛けます。

これを理解する方法は、ラジアンと度が「単位」であると想像することです。180 度ごとに π ラジアンがあります。つまり、π ラジアン/180 度は 1 です。これらはまったく同じ数の比率だからです。

あなたが107度を持っているなら、その107

IS 107 度 * 1 = 107 度 * π ラジアン/180 度。もちろん、コンピュータはユニットを気にしません。最終的には 107 * π/180 になります。

Objective-c では、M_PI は π の値を格納する定数です。

私がすることは、私が宣言することです

#define radianperdegree (M_PI/180) 

現在、値は実際には 1 ではありません。しかし、概念的には、単位を考慮に入れると、radianperdegree は確かに 1 です。これは、1 ラジアンが 1 度よりもはるかに大きいためです。

角度をラジアンで取得するには、角度を変更してはなりません。私がしているのは、概念的には 1 である数値を掛けることです。つまり、radianperdegree を掛けます。結果は、はるかに小さい数値です。しかし、そのはるかに小さい数は、まったく同じ角度を表しています。これは、はるかに小さい数値がラジアン単位の角度サイズであり、各ラジアンが大きいためです。

それから私はします

double result = sin(100.7 * radianperdegree);

多田……

クリア?

あなたができるもう一つのことは定義することです

#define RADTODEG(x) ((x) * 57.29578)
#define DEGTORAD(x) ((x) / 57.29578)

次に、sin(DEGTORAD(107)) を使用します。

于 2012-08-13T06:16:46.947 に答える