ゼロ除算
-
151
うそとまこと
2020/08/15(土) 17:46:42 ID: bmxKTOyqIr
-
👍0高評価👎0低評価
-
152
うそとまこと
2020/08/15(土) 20:45:24 ID: bmxKTOyqIr
-
👍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.wik ipedia.o rg/wiki/ %E6%B5%A E%E5%8B% 95%E5%B0 %8F%E6%9 5%B0%E7% 82%B9%E6 %95%B0
【NaN - Wikipedia】
https://ja.m.wik ipedia.o rg/wiki/ NaN
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
-
👍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低評価
-
166
うそとまこと
2020/08/23(日) 15:27:04 ID: bmxKTOyqIr
-
【減算で除算/C言語サンプル ソースプログラム/佐伯英子技術士事務所(情報工学)】
https://saeki-ce .xsrv.jp /C_src/w arizan02 .html
***引き算で割り算***
減算だけで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
-
👍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/w arizan02 .html
引き算で割り算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
-
👍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
-
👍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低評価
-
178
うそとまこと
2020/09/12(土) 10:48:55 ID: bmxKTOyqIr
-
👍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低評価