###前提・実現したいこと
Cで二次方程式の解の桁落ち回避の勉強をしています.
エラーこそないものの,結果がよくわからなくなりました.
###該当のソースコード
#include<stdio.h>
double *ans_01,*ans_02,*ans_11,*ans_12;
void func(int a, int b, int c);
int main(){
func(1,200,1); printf("\n case normal ans_01=%lf ans_02=%lf\n\n",*ans_01,*ans_02); printf("\n case normal ans_01=%lf ans_02=%lf\n\n",*ans_01,*ans_02); printf("address %p %p\n",ans_01,ans_02); printf("\n case amendment ans_11=%lf ans_12=%lf\n\n",*ans_11,*ans_02); printf("address %p %p\n\n",ans_11,ans_12); }
void func(int a, int b, int c){
double ans1,ans2,ans_1,ans_2;//解1解2
//普通の解の公式
ans1=(-b +sqrt(bb-4ac))/2a;
ans_01=&ans1;
ans2=(-b -sqrt(bb-4ac))/2a;
ans_02=&ans2;
//桁落ち回避の解の公式
ans_1=-2c/(b +sqrt(bb-4ac));
printf("\nans_1=%lf\n",ans_1);
ans_11=&ans_1;
printf("ans_11=%lf\n",ans_11);
ans_2=(-b -sqrt(bb-4ac))/2a;
printf("ans_2=%lf\n",ans_2);
ans_12=&ans_2;
printf("ans_12=%lf\n",*ans_12);
}
###実行結果
ans_1=-0.005000
ans_11=-0.005000
ans_2=-199.995000
ans_12=-199.995000
case normal ans_01=-0.005000 ans_02=-199.995000
case normal ans_01=0.000000 ans_02=1716135370016086648357823082419147293739285088855382684647829715174501852857816365139450596681494688651754125021696597892455681522040405973117550797667939399681019111492527896844793166396807267598705744674816.000000
address 0x7ffee1801ad8 0x7ffee1801ad0
case amendment ans_11=-0.005000 ans_12=1716135370016086648357823082419147293739285088855382684647829715174501852857816365139450596681494688651754125021696597892455681522040405973117550797667939399681019111492527896844793166396807267598705744674816.000000
address 0x7ffee1801ac8 0x7ffee1801ac0
###補足情報(言語/FW/ツール等のバージョンなど)
C/Mac
なぜans_01,ans_02の部分で全く同じprintfを書いているのに1回目ではしっかりと値が,2回目ではよくわからない値が出てしまうのでしょうか?
また,なぜans_12もans_12=-199.995000となっていたのにans_12=1716135370016086648357823082419147293739285088855382684647829715174501852857816365139450596681494688651754125021696597892455681522040405973117550797667939399681019111492527896844793166396807267598705744674816.000000のようによくわからない値になっているのでしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/08 15:59