151 うそとまこと
2020/08/15(土) 17:46:42 ID: bmxKTOyqIr
>>150
申し訳ないです、間違いました。この説明ですとcが1になってしまいます。

>>149
ループを一度も経ないことが駄だというなら、
>>146の加算で積算のa×0でもループを一度も経ないでprintf(答:c)→(答:0)になってますが、これはどう判断されますか?
for文を使用した加算と減算でもa+0とa-0がループを一度も経ないでprintf(答:a)になります。
👍
高評価
0
👎
低評価
0
152 うそとまこと
2020/08/15(土) 20:45:24 ID: bmxKTOyqIr
>>124
【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

このプログラムで、a<bで検証してください。
今後、同じような内容のfor文に関する否定などは受け付けないのでご了承ください。
👍
高評価
0
👎
低評価
0
153 うそとまこと
2020/08/16(日) 10:17:36 ID: bmxKTOyqIr
>>144
(a*b)/(b*b)とすることによって、aとbのどちらかが負数の場合、(a*b)を代入した分子xと答cは負数になります。
この性質を利用して、if(a<0)とif(b<0)をまとめてif(x<0)にして、それ以外をelseにしています。
負数のプログラムを作成する場合、色々な反転方法があり、ここでは正符号や負符号や不等号などを反転させてます。一ヶ所(-1)を掛け正と負の符号を反転させてます。

整数(int%d)を浮動小数点数(double%lf)に変えると小数対応になります。
>>144は、0÷0=0…0前提のプログラムなので、a÷0では余り(不足)が非数(non)と出されます。
では、どうして浮動小数では非数になるのか、
プログラム内のprintf("答:%d...%d(余り)\n",c,d/b);を
printf("答:%lf...%lf÷%lf(余り)\n",c,d,b);に変更し、a÷0をしてみます。
結果は、答:0.000000…0.000000÷0.000000(余り)になります。
0.000000÷0.000000を浮動小数で出しようとすると、規定でnonが出されるようです。
そこで、if文とelseを使って余り(不足)0とそれ以外を分けてみました。
そうすることで、0=0.000000と0以外の0.000000を区別することができます。
0以外の0.000000とは、0.0000001*0.0000001=0.000000などのことです。
それから、浮動小数誤差が生じるので、余り(不足)が0である数が余り(不足)が0以外に分けられることがありますのでご注意ください。
👍
高評価
0
👎
低評価
0
154 うそとまこと
2020/08/16(日) 18:03:46 ID: bmxKTOyqIr
【浮動小数点数 - Wikipedia
https://ja.m.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0exit

【NaN - Wikipedia
https://ja.m.wikipedia.org/wiki/NaNexit

0÷0=0…0前提の非数(non)対策割り算
整数(int%d)と浮動小数点数(double%lf)、負数対応、(※3分割してます)

#include <stdio.h>
int main()
{
double a,b,d,e,x,y;
int c,f,g;
printf("a÷b非数(non)策割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);
👍
高評価
0
👎
低評価
0
155 うそとまこと
2020/08/16(日) 18:05:58 ID: bmxKTOyqIr
x=(a*b);
y=(b*b);
d=x;
e=x;
if(x<0){
for(c=0;(d<=(y*(-1)))&&(d!=0);c=c-1)
{d=d+y;}
if(d==0){
f=d/b;
printf("答:%d...%d(余り)\n",c,f);
}
else{
printf("答:%d...%lf(余り)\n",c,d/b);
}
for(c=0;e<0;c=c-1)
{e=(e+y);}
if(d==0){
g=d/b;
printf("答:%d...%d(不足)",c,g);
}
else{
printf("答:%d...%lf(不足)",c,e/b);
}
return 0;
}
👍
高評価
0
👎
低評価
0
156 うそとまこと
2020/08/16(日) 18:08:54 ID: bmxKTOyqIr
else{
for(c=0;(d>=y)&&(d!=0);c=c+1)
{d=d-y;}
if(d==0){
f=d/b;
printf("答:%d...%d(余り)\n",c,f);
}
else{
printf("答:%d...%lf(余り)\n",c,d/b);
}
for(c=0;e>0;c=c+1)
{e=(e-y);}
if(d==0){
g=d/b;
printf("答:%d...%d(不足)",c,g);
}
else{
printf("答:%d...%lf(不足)",c,e/b);
}
return 0;
}
}

プログラムif(d==0)の内容は、余りdが0なら、整数(int)fに余りd÷bを代入し、整数(%d)で答:cと余りfを出

elseの内容は、dが0以外なら整数(%d)で答:cと浮動小数点数(%lf)で余りd/bを出
👍
高評価
0
👎
低評価
0
157 うそとまこと
2020/08/18(火) 06:13:00 ID: bmxKTOyqIr
余りめる割り算プログラムを使用して、通常の割り算プログラムを作成。
余りが0の場合、または割りきれる割り算の時は、答:cに余りdをb*bで割った数を足してもいいですが、答:cをそのまま出するだけでも大丈夫です。
余りが0以外の場合、または割りきれない割り算の時は、答:cに余りdをb*bで割った数を足します。

printf("答:%d...%d(余り) ",c,f);
printf("答:%d\n",c);

a÷b割り算
a:10
b:5
答:2...0(余り) 答:2
答:2...0(不足) 答:2

printf("答:%d...%lf(余り) ",c,d/b);
printf("答:%lf\n",c+(d/(b*b)));

a÷b割り算
a:10
b:3
答:3...1.000000(余り) 答:3.333333
答:4...-2.000000(不足) 答:3.333333
👍
高評価
0
👎
低評価
0
158 うそとまこと
2020/08/18(火) 06:15:32 ID: bmxKTOyqIr
余りめる割り算プログラムを使って割り算
#include <stdio.h>
int main()
{
double a,b,d,e,x,y;
int c;
printf("a÷b割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);
x=(a*b);
y=(b*b);
e=x;
if(x<0){
for(c=0;e<0;c=c-1)
{e=(e+y);}
if(e==0){
printf("答:%d\n",c);}
else{
printf("答:%lf",c+(e/(b*b)));}
return 0;}
else{
for(c=0;e>0;c=c+1)
{e=(e-y);}
if(e==0){
printf("答:%d\n",c);}
else{
printf("答:%lf",c+(e/(b*b)));}}
return 0;}
👍
高評価
0
👎
低評価
0
159 ななしのよっしん
2020/08/18(火) 18:16:24 ID: HaMFJqdJET
👍
高評価
0
👎
低評価
0
160 ななしのよっしん
2020/08/18(火) 19:05:41 ID: HaMFJqdJET
t≠0のときt÷t=1より、
a÷b = (a÷b)×(t÷t) = (a×t)÷(b×t)
という式変形を利用してt=bとして計算してるわけだけど、t=0のときはt÷t=0として計算している
逆数の定義からt÷t=1であり、このプログラム定義から0÷0=0なので、整合性を取るなら0=1とならざるを得ない
この計算ができると認めるならa/b = (a×0)/(b×0) = (2/3)×0/0 = 0 ということになって全ての数が0と等しくなってしまう
普通はそうならないためにゼロ除算になった間にエラーで停止するかNaNなどを出すかゼロ除算になりうるパターンを排除して特別扱いするかという対策が要る
どうしても0の逆数の存在を認めたいなら0≠1となる0÷0=1の方がまだマシなのでは
そして結局f=d/b;の行で0/0になるからc言語以外では0...NaNと表示することになってしまう
数学と整合を取るなら極限から類推してb=0の時に infinity...0かNaN...0になるべきだけどそうなっていないのでさらにマズイ
👍
高評価
0
👎
低評価
0
161 うそとまこと
2020/08/19(水) 18:30:25 ID: bmxKTOyqIr
等式では両辺に0/0をし分子と分を分けると、0÷0=0÷0になります。それから、0の除算や0/0だけでなく0の乗算でも同じようなことがいえます。
2×6=10+2
両辺に×0をすると、
(2×6)×0=(10+2)×0
0=0
全ての数が0と等しくなります。

>>125
このプログラムは、a=0以外のゼロ除算a÷0がエラー(オーバーフロー)を起こします。しかし、他のプログラムと違い整数から浮動小数点数に変えても0÷0はnanになりません。
この危険な状態のプログラムを使って、ゼロ除算(0÷0)の問題解決や明の助けになるよう説明していきたいと思います。

0÷0=0前提のプログラムを先に記載してきた理由は、>>125プログラムを『欠陥プログラム、危険なので使用禁止、0÷0だけでa÷0(a≠0)がエラーする、こんなプログラムでは拠にならない』等々、ある程度事前の否定を解消する為です。
逆に考えれば、0÷0さえ明できればa÷0も一緒に解決できるという答えに行き着くかと思います。

余りと(不足)に分けた理由も含め、数学視点での説明もしていく予定です。
※訂正:非数(non)→非数(nan)
👍
高評価
0
👎
低評価
0
162 うそとまこと
2020/08/20(木) 18:51:36 ID: bmxKTOyqIr
負の余り(不足)をめる割り算a÷b=c…e
整数(int%d)、負数非対応
⚠️警告…ゼロ除算a÷0(a≠0)でエラー(オーバーフロー)

#include <stdio.h>
int main()
{
int a,b,c,d,e;
printf("a÷b負の余り(不足)をめる割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

e=a;
for(c=0;e>0;c=c+1)
{e=e-b;}
printf("答:%d...%d(不足)",c,e);
return 0;
}

for文の内容は、aを代入したeが0より大きいなら、eからbを減算し続けてeが0以下なら終了。その回数が答:cになり減算された余りがe(不足)になります。

>>124
if(b==0)に関連する(例外処理)部分を削除したプログラム較してみてください。
👍
高評価
0
👎
低評価
0
163 うそとまこと
2020/08/20(木) 18:58:45 ID: bmxKTOyqIr
浮動小数点数の負の余り(不足)をめる割り算a÷b=c…e
浮動小数点数(double%d)、負数非対応
⚠️警告…ゼロ除算a÷0(a≠0)でエラー(オーバーフロー)

#include <stdio.h>
int main()
{
double a,b,c,d,e;
printf("a÷b浮動小数点数割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);

e=a;
for(c=0;e>0;c=c+1)
{e=e-b;}
printf("答:%lf...%lf(不足)",c,e);
return 0;
}

整数(int%d)から浮動小数点数(double%lf)に変更。
このプログラムの注点は、浮動小数点数にも関わらず、0÷0した結果がnanではなく答:0…0(不足)になります。
👍
高評価
0
👎
低評価
0
164 うそとまこと
2020/08/20(木) 19:03:15 ID: bmxKTOyqIr
負数対応の割り算a÷b=c…e
浮動小数点数(double%d)、負数対応
⚠️警告…ゼロ除算a÷0(a≠0)でエラー
#include <stdio.h>
int main(){
double a,b,c,d,e;
printf("a÷b負数対応の割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);
e=a;
if(a<0&&b<0){
for(c=0;e<0;c=c+1)
{e=e-b;}
}
else if(a<0){
for(c=0;e<0;c=c-1)
{e=e+b;}
}
else if(b<0){
for(c=0;e>0;c=c-1)
{e=e+b;}
}
else{
for(c=0;e>0;c=c+1)
{e=e-b;}
}
printf("答:%lf...%lf(不足)",c,e);
return 0;}
👍
高評価
0
👎
低評価
0
165 ななしのよっしん
2020/08/22(土) 02:14:26 ID: HaMFJqdJET
呆れて物も言えませんわ
0に関する反射から全ての元が0と一致するとするのは理がありすぎる
やってる計算もフツーの半環に仮定される公理特定の元について書いているだけで何の新しい情報もない
強いて言えば「ゼロを右から掛ける射はエピ射」というくらいだが整数の成す環ひいては実数の成す環にもともとそういう性質があるので新しい事実を導いているわけでもない
163164もa=0のときにforの中身を飛ばしてなにもしないから0あまり0という表記になっているだけで本質的にゼロ除算をしていないということに気付いていない
なにも理解できていないしなにも進歩していない
👍
高評価
0
👎
低評価
0
166 うそとまこと
2020/08/23(日) 15:27:04 ID: bmxKTOyqIr
【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

***引き算割り算***
減算だけでa÷bを計算します
a:2
b:5
答:0余り:2

減算で除算/C言語サンプル ソースプログラムを使って説明したいと思います。
for(c=0;a>=b;c++)
{a-=b}
計算結果のfor文の内容は、aがbより小さいので、aからbを減算せずに終了。カウントされなかったcが答:0になり、減算されなかったaが余り:2になります。
(aがb以上ならaからbを減算し続け、カウントされたcが答:cになり、減算されたaが余り:aになります)
0÷bでも同様に、カウントされなかったcが答:0になり、減算されなかったaが余り:0と出されます。

>>125プログラムの性質上、0÷bと(a×b)÷(b×b)仕様の0÷bとa÷0(ゼロ除算)だけが、上記と同様の動作をするので、勘違いされているのかと思われます。
>>165の『a=0のときにforの中身を飛ばして……本質的にゼロ除算をしていない』ですが、正確にはカウントされなかったcが答:0の時に、減算されなかったa(aを代入したe)が答:a(e)になります。
つまり、見当違いの摘だったので、>>152に繋がります。

>>152については、不特定多数が確認できるスレ明らかな説明不足でした。
👍
高評価
0
👎
低評価
0
167 うそとまこと
2020/08/23(日) 15:49:05 ID: bmxKTOyqIr
[謝り]>>125プログラムの性質上

[訂正]>>125の負の余りめる割り算の性質上

ここでいう新しい事実や進歩がどういったことなのかよく分からないです。

この先の説明は、>>162~>>164プログラムが0÷0=0…0になることが前提になるので、今までの説明やプログラムで他に気になる点や疑問などがあれば受け付けます。
👍
高評価
0
👎
低評価
0
168 削除しました
削除しました ID: HaMFJqdJET
削除しました
169 削除しました
削除しました ID: HaMFJqdJET
削除しました
170 うそとまこと
2020/08/31(月) 02:57:16 ID: bmxKTOyqIr
予定を変更して、減算で除算のソースプログラムを使用し、ゼロ除算してもエラー(オーバーフロー)しない引き算割り算a÷bのプログラムを作成。
その後は順序立てて説明したいと思います。

【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

引き算割り算a÷b
整数(int%d)、負数対応
2分割してます
if(b==0)やelse{}を削除してもエラー(オーバーフロー)しないプログラム。出結果や演算結果が削除状況に応じて変化します

#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[128];
int a,b,c,d;
printf("\n***引き算割り算***\n");
printf("\n減算だけでa÷bを計算します\n");
printf("\n a:");
gets(buf);a=atoi(buf);
printf("\n b:");
gets(buf);b=atoi(buf);
👍
高評価
0
👎
低評価
0
171 うそとまこと
2020/08/31(月) 02:59:03 ID: bmxKTOyqIr
if(a>=0&&b>0){
for(c=0;a>=b&&b>0;c++)
{a-=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
else if(a<=0&&b>0){
for(c=0;a<=b*(-1)&&b>0;c--)
{a+=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
else if(a>=0&&b<0){
for(c=0;a>=b*(-1)&&b<0;c--)
{a+=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
else if(a<=0&&b<0){
for(c=0;a<=b&&b<0;c++)
{a-=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
else if(b==0)
{printf("\nゼロ除算です");}
else
{printf("\n演算対外です");}
}
👍
高評価
0
👎
低評価
0
172 うそとまこと
2020/09/02(水) 08:23:30 ID: bmxKTOyqIr
【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

減算で除算のソースプログラムを使って、負数に対応したプログラムを作成。
if(b==0)やelse{}などを削除ゼロ除算するとエラー(オーバーフロー)します。
>>170>>171較推奨


引き算割り算a÷b
整数(int%d)、負数対応
if(b==0)やelse{}を削除ゼロ除算するとエラー(オーバーフロー)します。出結果が削除状況に応じて変化
※上部省略
👍
高評価
0
👎
低評価
0
173 うそとまこと
2020/09/02(水) 08:25:02 ID: bmxKTOyqIr
if(b==0)
{printf("\n0で割らないでください");}
else if(a<=0&&b<0){
for(c=0;a<=b;c++)
{a-=b;}
printf("\n答:%d余り:%d\n",c,a);
}
else if(a<=0){
for(c=0;a<=b*(-1);c--)
{a+=b;}
printf("\n答:%d余り:%d\n",c,a);
}
else if(b<0){
for(c=0;a>=b*(-1);c--)
{a+=b;}
printf("\n答:%d余り:%d\n",c,a);
}
else{
for(c=0;a>=b;c++)
{a-=b;}
printf("\n答:%d余り:%d\n",c,a);
}
}
👍
高評価
0
👎
低評価
0
174 うそとまこと
2020/09/05(土) 06:44:35 ID: bmxKTOyqIr
【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

この減算で除算のソースプログラムは、a<0では正確な値を出せず、b<=0ではエラー(オーバーフロー)します。
正常に動作させる為にifelse文を設定したとしても、for文のみのプログラムでは結局エラーします。
そこで、a<0の場合の出の仕方を参考に、b<=0の場合でも同様に出させることで、ゼロ除算を含めたb<=0でエラーしないfor文(プログラム)を作成。
👍
高評価
0
👎
低評価
0
175 うそとまこと
2020/09/05(土) 06:48:13 ID: bmxKTOyqIr
※上部省略
if(a>=0&&b>0){
for(c=0;a>=b&&b>0;c++)
{a-=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
else if(a<0||b<=0)
{printf("\n演算対外です");}
}


点は、for文に『&&b>0』を追加したことにより、ゼロ除算してもエラー(オーバーフロー)することはなくなりました。
if文とfor文が同じような条件式になってますが、
if文の条件式は、数式(a÷b)の範囲設定で、
for文の条件式は、演算式(a-=b)の範囲設定だと自分は解釈してます。
else if文は、通常else(全ての条件式が偽の時に実行する処理)のみを使用しますが、負数対応のプログラムで何故if(b==0)になるか説明するのに必要なので付け加えてます。
👍
高評価
0
👎
低評価
0
176 うそとまこと
2020/09/08(火) 01:35:02 ID: bmxKTOyqIr
>>175の訂正版

プログラミングにおいてelseは便利な反面、バグ(コンピュータプログラムにひそむ誤り)を誘発しやすいので削除if文構成に変更しました。
※上部省略
if(a>=0&&b>0){
for(c=0;a>=b&&b>0;c++)
{a-=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
if((a<0||b<=0)||(a==0&&b<=0))
{printf("\n演算対外です");}
}


否定の演算子『!』(のとき偽、偽のとき)を使用
※上部省略
if(a>=0&&b>0){
for(c=0;a>=b&&b>0;c++)
{a-=b;}
printf("\n答:%d 余り:%d\n",c,a);
}
if(!(a>=0&&b>0))
{printf("\n演算対外です");}
}
👍
高評価
0
👎
低評価
0
177 ななしのよっしん
2020/09/08(火) 01:41:21 ID: ymUbaZyAt4
プログラミング始めた頃に「0を含む乱数で除算する」って処理書いてしまって、ずっとよく分からないタイミングシステムが停止する原因に気づかず悩んでたわ、懐かしい
👍
高評価
0
👎
低評価
0
178 うそとまこと
2020/09/12(土) 10:48:55 ID: bmxKTOyqIr
>>171(>>174>>175>>176)は、ゼロ除算してもエラー(オーバーフロー)しない引き算割り算a÷bのプログラムですが、さらにif(b==0)例外処理を使用しないでゼロ除算できるプログラムを作成したいと思います。

【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

引き算割り算a÷b
整数(int%d)、負数非対応
ゼロ除算で答:0 余り:0(nan)を出するプログラム
if(b==0)例外処理未使用
余りがx/bについての説明は後でします
👍
高評価
0
👎
低評価
0
179 うそとまこと
2020/09/12(土) 10:51:14 ID: bmxKTOyqIr
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[128];
int a,b,c,d,x,y;
printf("\n***引き算割り算***\n");
printf("\n減算だけでa÷bを計算します\n");
printf("\n a:");
gets(buf);a=atoi(buf);
printf("\n b:");
gets(buf);b=atoi(buf);

x=a*b;
y=b*b;
if(a>=0&&b>=0){
for(c=0;x>=y&&y>0;c++)
{x-=y;}
printf("\n答:%d 余り:%d\n",c,x/b);
}
if(!(a>=0&&b>=0))
{printf("\n演算対外です");}
}
👍
高評価
0
👎
低評価
0
180 ななしのよっしん
2020/09/12(土) 10:56:34 ID: ydKHn9CEV+
ゼロ除算が何故ダメなのかの論理的な根拠は実はわかっていない
👍
高評価
0
👎
低評価
0