• 締切済み

C言語の質問

Fortran言語にはsign(x,y)の関数があります、つまりxの絶対値をもち、かつyの符号をもつ値を生成する関数です。 C言語にこのような関数をも使いたいのですが、調べてみるとcopysignという関数がありました、関数の機能説明もFortaranのsignと同じとなっています。しかしながら、実際にCのソースファイルにcopysignを使うと、ビルド時に、「error C3861: 'copysign': 識別子が見つかりませんでした」のエラーが出てきました。また宣言時に「#include <math.h>も入れています。  どちら様がご存知ならば教えていただければ幸いなことです。  宜しくお願い致します!<^ ^>!!!

みんなの回答

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

Visual studio 2005でしたら #include <float.h> を追加し copysignを_copysign(アンダーラインを前につける)にすれば、できるはずです。 当方、visula studio 2008で確認済みです。

wonwon99
質問者

お礼

大変助かりました。問題が解決しました。 本当に有り難うございました。感心します!<^^>!!<[[[]]]]>!!

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

因みに、C言語の基本は「無ければ作る」です。 で、「無ければ作る」の次に考えるのは「あっても、なくても、どっちでも動く」と言う工夫。これは「移植性」の為に必要。 あと、マクロ版を使う上での注意が1つあって「副作用がある引数は渡すな」という点。副作用があったらどうなるかは、やってみると判る。

wonwon99
質問者

お礼

どうも有り難うございました。

  • Visar
  • ベストアンサー率19% (17/87)
回答No.3

こんにちは。 環境がわかりませんがw MSDNのVisual Studio.NET 2003には、 _copysign()ってのがあり、 double _copysign( double x, double y ); 必須ヘッダーは<float.h>となっておりますが・・・ はずしていたらごめんなさい。

参考URL:
http://msdn.microsoft.com/ja-jp/library/0yafk1hc(v=VS.71)
wonwon99
質問者

お礼

教えていただき、どうも有り難うございました。 ただし、」ヘッダーに<float.h>を入れても、うまくいかないみたいですね。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

マクロで書けるので、マクロで書いてしまいましょう。 #ifndef sign #define sign(x,y) ((y) < 0 ? ((x) < 0 ? (x) : -(x)) : ((x) < 0 ? -(x) : (x))) #endif

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

使っている環境くらい掲示しましょうよ。 C99で追加されている標準関数…なんでしょうかね? http://www.c-tipsref.com/reference/math/copysign.html VS++2008EEでヘッダファイル内を検索すると…とりあえずあるようですが……。 使っているコンパイラによっては未対応…ということもありましょう。

wonwon99
質問者

お礼

どうも有り難うございます。 使用環境はMicrosoft Visual Studio 2005です。 また、うまくいっていないので、引き続き教えていただければ幸いなことです。 宜しくお願い致します。

関連するQ&A

  • C言語で数字の符号を取る関数は?

    Cを使って数値の符号を取るような関数ってありますか? 具体的には、Fortranを例にとると、 |x|にyの符号をつけるときには、 SIGN(x,y) としますが、これと同じ事をCでやりたいと思っています。 xの絶対値を取るような関数は fabs(x) でできる事は知っているのですが、 yの符号をどうやって取るのかがわからないのです。 あと、ちょっと違う質問なんですが、 ある本のfortranのプログラムで !x=・・・・・・ というのがあったんですが、この !x というのは どういう意味なのか、教えていただければ幸いです。 基本的な質問かも知れませんが、よろしく御願いします。

  • C言語の関数に関する質問ですが

    C言語の初心者です。よろしくお願いいたします。 授業でこのような演習が出ました。 演習:実数x を入力したときの最大値を求めるプログラムを作れ. 実数x を入力すると,x; -x; x2; xの絶対値の平方根 の中で一番大きい値を答える プログラムを作れ(ファイル名はmax.c とする). 表示は以下のようにする. Input x: -0.5 【Enter】 Answer is 0.707107. #include<stdio.h> #include<math.h> double max(double a, double b){ if( a > b) return a; else return b; } int main(void) { double x,y; printf(\"Input x: \"); scanf(\"%lf\",&x); y = max (x,-x); y = max (y,x*x); y = max (y,sqrt(fabs(x))); printf(\"Answer is %f.\\n\",y); } このように書けばうまく実行できますが、関数の中に関数を使えないでしょうか。うまく言えないですが、たとえば、以下のように書いてみましたが、うまく実行できません。どう直したらいいでしょうか、お忙しい中教えていただけたらうれしいです。 #include <stdio.h> #include <math.h> int max(double a,double b) { if (a<b) return b; else return a;} int main(void) { double x,result; printf(\"Input x:\"); scanf(\"%lf\",&x); result=max(max(x,-x),max(pow(x,2),sqrt(fabs(x)))); printf(\"%.2f\",result); return 0; } よろしくお願いいたします!!

  • C言語のプログラムに関することで質問です。

    C言語のライブラリを利用したプログラムのことで質問なのですが、座標xとyの成分から、ベクトルの角度(t)と大きさ(r)を求めるプログラムを作りました。しかし、このままのプログラムだと、ある場合のときに限り、正しい値が返されなくなるらしいのですが、それはどのような場合で正しい値が返されなくなってしまうのかを教えてください。また、正しい値がでるようにするにはどこをどう直したらよいのでしょうか? 自分でも考えてみたのですが、分からず困っています。分かる方どうかよろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define square(x) ((x) * (x)) //ベクトルの角度θを返す関数 double theta(double x, double y) { return atan(y / x); } //ベクトルの大きさを返す関数 double radius(double x, double y) { return sqrt(square(x) + square(y)); } int main(int argc, char **argv) { double x, y; //x, yは座標 double t, r; //t, rは極座標 if(argc == 3 && (x = atof(argv[1])) && (y = atof(argv[2]))) { t = theta(x, y);  //極座標tを計算 r = radius(x, y); //極座標rを計算   //ベクトルの角度と大きさを表示 printf("t = %f, r = %f\n", t, r); } return 0; }

  • Cプログラミングの質問です。

    方程式2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x=0の解xを二分法により求め、それを”atai=××”と表示させるプログラムを書こうと思っているのですが、エラーがでてしまい、さらにどこを直していいかわかりません。 詳しい方がおられましたら、アドバイスをいただけたらと思います。よろしくお願いいたします。 <エラー内容> 「コンパイルしています... tom.cpp .\tom.cpp(34) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): または 'float pow(float,int)' C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): または 'double pow(double,int)' 引数リスト '(int, int)' を一致させようとしているとき .\tom.cpp(34) : error C2059: 構文エラー : 'サフィックスが無効です。' .\tom.cpp(34) : error C2146: 構文エラー : ';' が、識別子 'x' の前に必要です。 ビルドログは "file://c:\Documents and Settings\satoutakaaki\デスクトップ\file\tom\tom\Debug\BuildLog.htm" に保存されました。 tom - エラー 3、警告 0」 <プログラム> #include "stdafx.h" #include <stdio.h> #include <math.h> double fx(double x); int main (void){ double x1=-1000; double x2=1000; double xn; double y; int i=0; for(i=1;i<100;i++) { xn=0.5*(x1+x2); y=fx(xn); if(y>0) {x1=x1/2+x2/2;} if(y<0) {x2=x1/2+x2/2;} i=i+1; } printf("atai=%f",xn); return 0; } double fx(double x) { double z; z=2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x; return z; }

  • LSI C-86試食版のコンパイルエラーが出ます:Undefined symbol : pow_

    下記のC言語のプログラムでpow関数を使っていますが、コンパイル時にエラー(Undefined symbol : pow_)がでます.この原因をご教示いただけませんか。 LSI C-86試食版を使用しています。 #include <stdio.h> #include <math.h> int main(void) { double x; double y; double z; x=2.3; y=3.3; z=pow(x,y); }

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • C言語で質問です。

    C言語で質問です。 F1=2*((4*sqrt(2)*cos(y)/sin(x+y))-4) F2=1*((4*sqrt(2)*cos(x)/sin(x+y))-4) という式を、 double f1(double x,double y) {return F1*sin(x)-F2*sin(y);} という部分のF1,F2に代入したいのですが、何を使えばいいのでしょうか。 いろいろ試したのですがエラーが出てしまいます。教えてください。

  • Visial C++おけるπの使い方

    自宅でCプログラミングの練習をするためVisial C++ 2008を使って プログラムをしています。y<sin(πx)となった時の 割合などを計算するプログラムで                「M_PIが定義されていない識別子です」 とでてきます。所持している本を参考にしてもM_PI=πとして用いる と書いてあり、math.hもインクルードしてるので原因が分からなくて 困ってます。Visial c++ではπの使い方には何か別の使い方がある のでしょうか?よろしくお願いします。 *↓が実際に作ったプログラムです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> int main(void){ int i,n,count=0; double x,y,r,error; srand((unsigned)time(NULL)); /*乱数の初期化*/ printf("How many trials?"); scanf("&d",&n); for(i=0;i<n;i++){ x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if(y<sin(M_PI*x)){ count++; } } r=(double)count/n; /*キャスト演算子を使用*/ error=2/M_PI-r; printf("Result is %f (Error: %f)\n",r,error); return 0; }

  • c言語 最大公約数

    C言語のプログラムについてです。 2つの正の整数x,y(任意)の最大公約数、最小公倍数を求めるプログラムを作ってください。(それぞれ、1個ずつ) ただし、関数は使わないでください。#include<stdio.h>のみ 回答よろしくお願いいたします。

  • C言語での計算

    C言語初心者で、計算するプログラムを作ってみようと思い、少ない知識で十進数を二進数にするプログラムを作ってみましたが、うまくいきません。 #include <stdio.h> #include <math.h> main () { int s, t, r; double x=10,y,n; printf("十進数は"); scanf("%d",&s); n = s / 2; r = s % 2; y = pow(x, n); t = y + r; printf("二進数は%d",t); return 0; } コンパイルして実行してみると、3つ問題が見つかりました。 (1)十進数が0のとき、二進数が1と表示される。 (2)十進数が1のとき、二進数が2と表示される。 (3)十進数が20以上のとき、正しい値が表示されない。 問題箇所を指摘していただけると幸いです。 よろしくお願いします。

専門家に質問してみよう