• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:long double型の戻り値を持つ関数について)

long double型の戻り値を持つ関数について

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> そこで、デバッガを使って調べたところ、StrToValue(AnsiString str)のreturn直前では、 >  result=-1.55519334183474013 > となっており、str を正確に数値に変換していました。 ということであれば、可能ならば、関数の宣言から _fastcall を外すと、 回避できるかもしれません。 > long double convert_2(char* str) > { >   long double ret; >   double a; >   sscanf(str, "%lf", &a); >   ret = a; >   return ret; > } > a-kuma さんに作っていただいたこのプログラムでも、ret の値はreturn したときに後ろの数桁が消滅すると思われます。 こっちの関数は、*わざと* 精度を落としています。文字列→実数の展開を double で(つまり、%lf を使って)いるので、ret に代入している時点で long double の精度がありません。

hungrycat
質問者

お礼

ありがとうございました。 関数の宣言から__fastcallを外して、TGraphFormのメソッドではない独立の関数にしたところ、うまく行きました。 いろいろお手数かけてすみませんでした。。

関連するQ&A

  • C言語:double型での戻り値は小数点以下何桁ですか?

    Cでプログラミングの勉強をしています。 double型で宣言した変数をprintfで出力するとき、代入した数値は小数点以下1桁なのに、なぜか出力結果では6桁になると問題集に書かれていました。解説はありません。 プログラムは下のものですが、なぜかお分かりになる方、教えていただけませんか? #include<stdio.h> struct test{ int x; double y; } void print(struct test a); void set_value(struct test a); void main(void){ struct test a ={1, 2.0}; set_value(a); print(a); } void print(struct test a){ printf("a.x = &d, a.y= %f\n", a.x, a.y); } void set_value(struct test a){ a.x =10; a.y =20.0; }

  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • イプシロン値を使った比較関数

    先日、↓でイプシロン値の記述方法を質問し、お陰様で一つ賢くなりました・・・ https://okwave.jp/qa/q9625188.html 今回、このイプシロン値を使用して2つの浮動小数点数の比較関数を作ってみました。 ところが、意図した結果になりません(数値により正しく判断できない場合がある) //倍精度浮動小数点数比較関数 //相対誤差内であれば、両者は等しいとする //戻り値 a=bのとき:0 a≠bのとき:0以外 #include <math.h> int CompareDoubleValue(const double a, const double b) { //引数の差の絶対値とイプシロン値を使用した相対誤差を比較する //1と引数の大きい方の数値を比較して、より大きい数値をイプシロン値 //と乗算して相対誤差とする if (fabs(a-b) <= (DBL_EPSILON*fmax(double(1), fmax(a, b)))) return(0); else return(-1) ; } ※fabs():倍精度浮動小数点数の絶対値を求める標準関数 ※fmax():2つの引数(倍精度浮動小数点数)の大きいほうの値を返す標準関数 何が悪いのかわからず困っております。 お教え頂けると幸いです。 よろしくお願いします。

  • c言語の変数の型について

    浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。ちなみに、doubleとlong doubleの違いも判りません。 あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね?

  • 型指定子についての教えてください。

    コンパイラはMicrosoft visual C&C++を使用しています。 (1)型指定子のfloat,doubleの大きい数値について。 計算をするとfloatは7桁までは正しくて、7桁より大きい桁はデタラメです。doubleは15桁までは正しくて、15桁より大きい桁はデタラメです。有効数字7桁,15桁とはこういうことでしょうか。 後、floatは有効数字7桁、doubleは有効数字15桁で本当に正しいのでしょうか。 (2)型指定子のfloat,doubleの小数点以下の数字について。 floatは10^-38まで、doubleは10^-308までの数字を扱えると参考書には書いてありますが、計算をしますと小数点以下6桁までは求まりますが、それ以下は求まりまりません。それ以下の数値はすべて0になります。なぜでしょうか。 (3)int,long intとdouble long doubleの違いについて。 intとlong intはともに-2147483648~2147483647までの範囲だと思います。またdoubleとlong doubleはともに有効数字15桁でした。何か違いがあるのでしょうか?

  • 浮動小数点変換

    (1)次の数値をIEEE754単精度形式で正規化された浮動小数点に変換し、結果を8桁の16進数で表記しなさい。 (a)0.5 0.5を二進数で表すと0.1 0.1*2^0であるから 0 00000000 10000000000000000000000 (b)1.0 1.0を二進数で表すと1.0 0.1*2^1であるから 0 10000000 10000000000000000000000 (c)1.25 1.25を二進数で表すと1.010 0.101*2^1であるから 0 10000000 10100000000000000000000 浮動小数点への変換、あってますでしょうか? また結果を8桁の16進数で表記とありますが 0.5だったら16進数で表すと0.9?これを8桁*16^なんとか乗で表すということでしょうか?

  • サンプルコードのコメントの意味が理解できません。

    『独習C 第3版』に下記問題とその解答コードがありますが、 解答コードの変数「d」を初期化している意味がコメントを読んでも分かりません。 初期化しないとどんな問題があるのでしょうか? 教えて下さい。 【問題】 文字列とdouble値と整数値を入力させ、これらの数値を読み込んだ後、 入力された文字数を表示するプログラムを作成してください。 【解答】 --------------------------------------------------------- /* apdC-115.c */ #include <stdio.h> int main(void) { char str[80]; /* 浮動小数点ルーチンが必ず使えるよう、何か浮動小数点数値 を使って、dを初期化しておく */ double d = 3.1415926; int i, num; printf("文字列、double型、整数を入力してください: "); scanf("%s%lf%d%n", str, &d, &i, &num); printf("読み込まれた文字数: %d", num); return 0; } --------------------------------------------------------- なお、自分の環境は、OSがVistaで、コンパイラがVC++2008です。

  • 関数の戻り値を構造体配列で。 VC++2005

    構造体配列で値を戻すようコードを試行錯誤しています。ご教授下さい。 開発環境は、XPpro VisualStudio2005アカデミックです。 コード(抜粋) struct double3d{ double x, y, z; }; //倍精度浮動小数三次元デカルト要素構造体型 //COAクラスのpublicで宣言。COAクラスを「psmf」でnewしています。 double3d COA::getu(double3d tempGP) { double3d tempCOA[2][2][2];  //構造体配列 中略 return tempCOA;  //*1 //tempCOAの先頭アドレスを返す } 別のインスタンスから、 (double3d tCOA[2][2][2];) tCOA = psmf->getu(GPosit); と呼び出しています。(関数の呼び出し部分の動作は確認済) この状況でコンパイルすると、*1の行で 'double3d::double3d(const double3d &)' : 1 番目の引数を 'double3d [2][2][2]' から 'const double3d &' に変換できません。(理由: 'double3d [2][2][2]' から 'const double3d' へは変換できません。コンストラクタはソース型を持てません、またはコンストラクタのオーバーロードの解決があいまいです。) とエラーになります。 自分としては、戻り値に構造体配列の先頭アドレスを返しているつもりなのですが…。 尚、*演算子、&演算子で戻しても同様のエラーです。 様々なウェブサイトを拝見したのですが、構造体配列を戻り値として解説しているサイト様も少なく、手詰まりの状態です。 お手数をおかけしますが、宜しく御願いいたします。

  • 変数について

    質問1:-0.0685274635この数値を扱うのは(計算したりIFで判断するには)どの変数を使えば良いですか? '変数 Variant Double=倍精度浮動 Currency=通貨型 Integer=整数型 Float=浮動小数点型 Long=長整数型 Dim CAL_DA As Integer Range("A1")="-0.0685274635" CAL_DA =Range("a1") 質問2:CAL_DAが-6.85274..になってしまいます。 ただし、必要とするのは-0.068の桁でよいのですが 質問3:CAL_DA =Mid(Range("a1"),1,6)いけますか? 以上ですよろしくお願いします。

  • 「浮動小数点表示」と「丸め」について

    数値解析についての質問です。 「23.49を有効数字4桁の浮動小数点表示で書け」という問題があるときは 0.2349 * 10^2 と答えるのが正しいのでしょうか。 つまり「浮動小数点表示で答えよ」とあれば、 0.○○○... * 10^○の形で書けば良いのでしょうか。 また、数値の丸めの仕方に関する質問なのですが、教科書に以下のような記述がありました。 k+1桁以降の数を切り捨てる a.この切り捨てられた数が第k桁の単位の半分より小さいときは、第k桁の数はそのままにする。 b.もし半分より多きときには第k桁の数に1を加える c.この切り捨てられた数が第k桁のちょうど半分のときには最も近い偶数に丸める とあるのですが、その後の記述で 「1.2535をそれぞれ小数点以下3桁、2桁、1桁で丸めると、1.254,1.25,1.3が得られる」また「小数第3位以下の情報なしで、1.25を1桁で丸めると1.2になる」とあるのですが、 後者が1.2になるのは理解できるのですが、最初の規則に則ると前者も1.2になるように思うのですが、何故1.3になるのでしょうか。 以上の規則に則った上で以下の問題に答えてみました。 問.-89.216618, 500000, -0.002213675を丸めて有効数字5桁の浮動小数点表示で書け 僕の答え -0.89217 * 10^2 0.50000 * 10^6 -0.22137 * 10^-2 というのは合っていますでしょうか。 質問が多くて大変恐縮ですが、解説、ご指摘をお願いします。 よろしくお願いします。