C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
探検
C++相談室 part146
■ このスレッドは過去ログ倉庫に格納されています
2019/11/07(木) 11:35:36.76ID:4wggfTwe
231デフォルトの名無しさん
2019/11/26(火) 20:49:49.76ID:78UVTJ0X232デフォルトの名無しさん
2019/11/26(火) 20:51:56.72ID:78UVTJ0X 除算を筆算方式なんかでやってたら日がくれる
233デフォルトの名無しさん
2019/11/26(火) 20:54:28.73ID:78UVTJ0X 分子の桁数が大きくて分母の桁数が非常に小さい場合のみ筆算方式が有効
この場合も、
非常に遅い割り算命令なんかは使いませんが
この場合も、
非常に遅い割り算命令なんかは使いませんが
234デフォルトの名無しさん
2019/11/26(火) 20:56:28.50ID:sE/nea3J >>229
>除算は筆算流しか手はありません
そうではありません。除算をCPUにある除算命令を使った筆算で行うには、x/y の
xのBIT数を増やすのは容易ですが、yの方のBIT数を増やすのは非常に難しいのです。
不可能では有りませんが、非常に数学的な注意が必要となります。
私は数学マニアみたいなものなので、自分なりのアルゴリズムを作ったことが
ありますが、個人的には、それをするためにはテーラー展開の剰余項や解析学的な
知識が必要だと思っています。
考えもしませんでしたが、他にも除算は、ニュートン方を使う流儀もあるそうです。
>除算は筆算流しか手はありません
そうではありません。除算をCPUにある除算命令を使った筆算で行うには、x/y の
xのBIT数を増やすのは容易ですが、yの方のBIT数を増やすのは非常に難しいのです。
不可能では有りませんが、非常に数学的な注意が必要となります。
私は数学マニアみたいなものなので、自分なりのアルゴリズムを作ったことが
ありますが、個人的には、それをするためにはテーラー展開の剰余項や解析学的な
知識が必要だと思っています。
考えもしませんでしたが、他にも除算は、ニュートン方を使う流儀もあるそうです。
235デフォルトの名無しさん
2019/11/26(火) 20:58:37.06ID:sE/nea3J >>233
いえ、そうでもありません。テーラー展開の剰余項を注意深く扱うと、
CPUがもつdiv命令を使った筆算の場合でも、x/y の y の方のBIT数を
増やすアルゴリズムがありえます。何度も書いてますが、それは数学的に
とても慎重さを必要とします。
いえ、そうでもありません。テーラー展開の剰余項を注意深く扱うと、
CPUがもつdiv命令を使った筆算の場合でも、x/y の y の方のBIT数を
増やすアルゴリズムがありえます。何度も書いてますが、それは数学的に
とても慎重さを必要とします。
236デフォルトの名無しさん
2019/11/26(火) 21:00:22.71ID:sE/nea3J237デフォルトの名無しさん
2019/11/26(火) 21:03:02.62ID:78UVTJ0X238デフォルトの名無しさん
2019/11/26(火) 21:04:44.09ID:78UVTJ0X 分母、分子それぞれの桁数によって
最適な方法は変わる
だからそういった条件をセットで語らないと意味がない
最適な方法は変わる
だからそういった条件をセットで語らないと意味がない
239デフォルトの名無しさん
2019/11/26(火) 21:06:41.35ID:78UVTJ0X 巨大な桁数同士だとニュートン法が速い
乗算の3倍ほどの時間で出来る
割り算を組み合わせたらそんな時間では計算出来ない
乗算の3倍ほどの時間で出来る
割り算を組み合わせたらそんな時間では計算出来ない
>>231
ニュートン法(にゅーとんらぷそん)って、曲線で与えられる関数の根の一つを求める方法でしょ?
いわゆる実数の根を求める方法であって、整数の剰余を求めることはニュートン法では無理なのでは?
何がどうなって「当然」なんですか?
ニュートン法(にゅーとんらぷそん)って、曲線で与えられる関数の根の一つを求める方法でしょ?
いわゆる実数の根を求める方法であって、整数の剰余を求めることはニュートン法では無理なのでは?
何がどうなって「当然」なんですか?
241デフォルトの名無しさん
2019/11/26(火) 21:19:25.20ID:78UVTJ0X 除算が出来るんだから剰余も当然求められる
243デフォルトの名無しさん
2019/11/26(火) 21:23:39.77ID:78UVTJ0X 遅くないです
>>243
本当ですか?わざわざ、あらためて掛け算をするんですよ?私には馬鹿みたいな方法にみえますが?
本当ですか?わざわざ、あらためて掛け算をするんですよ?私には馬鹿みたいな方法にみえますが?
245デフォルトの名無しさん
2019/11/26(火) 21:26:45.06ID:78UVTJ0X 馬鹿みたいな方法にみえるのはあなたが馬鹿だからです
246デフォルトの名無しさん
2019/11/26(火) 21:29:07.44ID:sE/nea3J >>242
ニュートン法なので、
z = b / a の z を求めたい場合、直線 y = a * x - b と x 軸(y=0) との交点の
x を求めることによって行う。その際、x0, x1, ・・・, xn のように x を
漸化的に交点に近づけていく。数学的直感だと、その途中で剰余も求められ
るように出来そうな気がする。
ニュートン法なので、
z = b / a の z を求めたい場合、直線 y = a * x - b と x 軸(y=0) との交点の
x を求めることによって行う。その際、x0, x1, ・・・, xn のように x を
漸化的に交点に近づけていく。数学的直感だと、その途中で剰余も求められ
るように出来そうな気がする。
247デフォルトの名無しさん
2019/11/26(火) 21:43:45.68ID:sE/nea3J >>246
色々なやり方はあると思うけど、2^m <= a < 2^(m+1) の場合、
x_{k+1} = x_k - (y_k << m);
y_{k+1} = a * x_{k+1} - b;
の漸化式でいけるかも知れない。
間違っていたらゴメンなさい。
色々なやり方はあると思うけど、2^m <= a < 2^(m+1) の場合、
x_{k+1} = x_k - (y_k << m);
y_{k+1} = a * x_{k+1} - b;
の漸化式でいけるかも知れない。
間違っていたらゴメンなさい。
248デフォルトの名無しさん
2019/11/26(火) 21:44:43.61ID:78UVTJ0X249デフォルトの名無しさん
2019/11/26(火) 21:49:53.94ID:sE/nea3J250デフォルトの名無しさん
2019/11/26(火) 21:53:39.27ID:sE/nea3J >>247
ここで、0<= y_k < x_k が満たされれば、x_k が商、y_k が余りだと思う。
初期条件は、
x_0 = 1;
y_0 = a * x_0 - b;
とすればよいはず。
途中、y_k が負の値になることが有るが、問題ない。
ここで、0<= y_k < x_k が満たされれば、x_k が商、y_k が余りだと思う。
初期条件は、
x_0 = 1;
y_0 = a * x_0 - b;
とすればよいはず。
途中、y_k が負の値になることが有るが、問題ない。
251デフォルトの名無しさん
2019/11/26(火) 21:55:42.20ID:78UVTJ0X 前提は分母も分子も巨大な桁数で良いんだよね?
252デフォルトの名無しさん
2019/11/26(火) 21:56:38.32ID:78UVTJ0X 分母の桁数があまり大きくないならテーラー展開も有効だよ
253デフォルトの名無しさん
2019/11/26(火) 21:57:23.51ID:sE/nea3J >>251
一般的な場合を取り扱うのであれば、その条件が、もっともらしいと思います。
一般的な場合を取り扱うのであれば、その条件が、もっともらしいと思います。
254デフォルトの名無しさん
2019/11/26(火) 21:57:37.73ID:78UVTJ0X いずれにしろ、
除算命令を多用することは無い
除算命令を多用することは無い
255デフォルトの名無しさん
2019/11/26(火) 21:58:41.68ID:sE/nea3J ニュートン法を使うのは初めて聞きました。
とても勉強になります。
とても勉強になります。
256デフォルトの名無しさん
2019/11/26(火) 21:59:47.69ID:78UVTJ0X >>253
それで漸化式3回なんてことはあり得ないかと
それで漸化式3回なんてことはあり得ないかと
257デフォルトの名無しさん
2019/11/26(火) 22:01:24.02ID:sE/nea3J ○<< m とせずに ○<< (m+1) としておけば、y_k は負の数にならないかも
知れない。ただ、数学的直感的に、収束速度は、前者の方が速い気がする。
知れない。ただ、数学的直感的に、収束速度は、前者の方が速い気がする。
258デフォルトの名無しさん
2019/11/26(火) 22:03:05.27ID:78UVTJ0X259デフォルトの名無しさん
2019/11/26(火) 22:07:18.12ID:78UVTJ0X 八木アンテナを八木宇田アンテナと書かないのと同程度に
ニュートンラプソン法とは書かないと思っているので
印象に残ってます
ニュートンラプソン法とは書かないと思っているので
印象に残ってます
>>258
raphson の ph を摩擦音で読むか、有気破裂音で読むかは、選択可能かと思っていましたが
raphson の ph を摩擦音で読むか、有気破裂音で読むかは、選択可能かと思っていましたが
261デフォルトの名無しさん
2019/11/26(火) 22:10:11.81ID:sE/nea3J >>247
まず、シフトの向きが右で、正しくは、○>>○ でした。
まず、シフトの向きが右で、正しくは、○>>○ でした。
262デフォルトの名無しさん
2019/11/26(火) 22:16:30.64ID:78UVTJ0X >>260
何を指摘されてるのかわかってないwww
何を指摘されてるのかわかってないwww
263デフォルトの名無しさん
2019/11/26(火) 22:19:47.56ID:sE/nea3J >>256
では、BIT SHIFT ではなく、浮動小数点演算にして、以下の様にすれば速くなるかもしれません。
(i) 初期条件
η = 1/a; // 多倍長の浮動小数点
x_0 = 1;
y_0 = a * x_0 - b;
(ii) 漸化式
x_{k+1} = x_k - (int_N)(y_k * η);
y_{k+1} = a * x_{k+1} - b;
但し、int_N は、多倍長の浮動小数点を多倍長整数に直す cast。
では、BIT SHIFT ではなく、浮動小数点演算にして、以下の様にすれば速くなるかもしれません。
(i) 初期条件
η = 1/a; // 多倍長の浮動小数点
x_0 = 1;
y_0 = a * x_0 - b;
(ii) 漸化式
x_{k+1} = x_k - (int_N)(y_k * η);
y_{k+1} = a * x_{k+1} - b;
但し、int_N は、多倍長の浮動小数点を多倍長整数に直す cast。
264デフォルトの名無しさん
2019/11/26(火) 22:34:50.59ID:FauhtWma #include <iostream>
using namespace std;
int main() {
string str = "abc";
cout << &str << endl;
cout << str << endl;
cout << str.c_str() << endl;
return 0;
}
VisualStudio2019のdebugとreleaseとで&strのメモリダンプ内容が異なるのはなぜでしょうか?
debug : 78 f7 b6 00 61 62 63 00
release : 61 62 63 00
using namespace std;
int main() {
string str = "abc";
cout << &str << endl;
cout << str << endl;
cout << str.c_str() << endl;
return 0;
}
VisualStudio2019のdebugとreleaseとで&strのメモリダンプ内容が異なるのはなぜでしょうか?
debug : 78 f7 b6 00 61 62 63 00
release : 61 62 63 00
265デフォルトの名無しさん
2019/11/26(火) 22:34:54.21ID:78UVTJ0X 1/a が求まれば
あとは乗算2回(と軽い演算)で剰余が求まるでしょ
漸化式にするまでもなく
あとは乗算2回(と軽い演算)で剰余が求まるでしょ
漸化式にするまでもなく
266デフォルトの名無しさん
2019/11/26(火) 22:36:37.97ID:78UVTJ0X >>264
デバッグ情報とか破壊検出用データとかじゃ?
デバッグ情報とか破壊検出用データとかじゃ?
267デフォルトの名無しさん
2019/11/26(火) 22:37:41.67ID:sE/nea3J268デフォルトの名無しさん
2019/11/26(火) 22:42:23.06ID:FauhtWma269デフォルトの名無しさん
2019/11/26(火) 22:44:29.12ID:78UVTJ0X270デフォルトの名無しさん
2019/11/26(火) 22:45:06.01ID:sE/nea3J >>268
そうなりますね。
malloc() や new なども、Debug 版と Release 版ではライブラリに互換性が
有りません。Debug 版では、まさに、破壊検出用の埋め草のような物が入っていたり、
new を行った行番号情報が入っていたりします。
そうなりますね。
malloc() や new なども、Debug 版と Release 版ではライブラリに互換性が
有りません。Debug 版では、まさに、破壊検出用の埋め草のような物が入っていたり、
new を行った行番号情報が入っていたりします。
271デフォルトの名無しさん
2019/11/26(火) 22:46:50.29ID:FauhtWma272デフォルトの名無しさん
2019/11/26(火) 22:49:29.81ID:sE/nea3J >>269
私は特に仮定はしていませんが、四倍浮動小数点型などに興味があり、
それを整数演算に置き換えて実装してみようかと思っていたりするので、
割る数も割られる数も同じくらいのBIT数の整数の場合に興味があります。
前に調べたところ、倍精度浮動小数点演算を用いて、四倍精度浮動小数点
の乗算、除算まで実装する方法があるようですね。ただし、その場合、
Intelの内部拡張倍精度(80BIT)方式をONにしていると駄目なんだそうですが。
私は特に仮定はしていませんが、四倍浮動小数点型などに興味があり、
それを整数演算に置き換えて実装してみようかと思っていたりするので、
割る数も割られる数も同じくらいのBIT数の整数の場合に興味があります。
前に調べたところ、倍精度浮動小数点演算を用いて、四倍精度浮動小数点
の乗算、除算まで実装する方法があるようですね。ただし、その場合、
Intelの内部拡張倍精度(80BIT)方式をONにしていると駄目なんだそうですが。
273デフォルトの名無しさん
2019/11/26(火) 22:57:18.80ID:78UVTJ0X274デフォルトの名無しさん
2019/11/26(火) 22:58:49.33ID:YRq1zw3m275デフォルトの名無しさん
2019/11/26(火) 22:59:27.13ID:sE/nea3J >>265
aがN BIT の場合、例えば、1/a を、64BIT 程度で求めた場合は、
(N / 64) (回) 程度の乗算が必要になりそうです。
1/a を高速に N BIT まで求めるアルゴリズムがありますでしょうか?
aがN BIT の場合、例えば、1/a を、64BIT 程度で求めた場合は、
(N / 64) (回) 程度の乗算が必要になりそうです。
1/a を高速に N BIT まで求めるアルゴリズムがありますでしょうか?
276デフォルトの名無しさん
2019/11/26(火) 22:59:32.53ID:78UVTJ0X それ以前の普通の乗算でも出来るけど
AVXでSIMD化出来るのでたくさん計算するならぜひ
AVXでSIMD化出来るのでたくさん計算するならぜひ
277デフォルトの名無しさん
2019/11/26(火) 23:01:27.32ID:sE/nea3J >>273
興味深いです。教えていただければ幸いです。
興味深いです。教えていただければ幸いです。
278デフォルトの名無しさん
2019/11/26(火) 23:02:58.56ID:YRq1zw3m279デフォルトの名無しさん
2019/11/26(火) 23:05:02.93ID:78UVTJ0X >>275
私が何度か除算は乗算の3倍の時間と書いたのは
例えば100万桁同士の除算は100万桁同士の乗算の3倍な時間という意味
乗算命令の回数ではなくて
aが100万桁で1/aを100万桁精度で求めるのは
100万桁同士の乗算の2倍くらいの時間で出来る
私が何度か除算は乗算の3倍の時間と書いたのは
例えば100万桁同士の除算は100万桁同士の乗算の3倍な時間という意味
乗算命令の回数ではなくて
aが100万桁で1/aを100万桁精度で求めるのは
100万桁同士の乗算の2倍くらいの時間で出来る
280デフォルトの名無しさん
2019/11/26(火) 23:10:41.35ID:sE/nea3J 例えば、割り算部分をテーラー展開ですか。
281デフォルトの名無しさん
2019/11/26(火) 23:17:37.02ID:78UVTJ0X >>277
{a_hi, a_lo} と {b_hi, b_lo} の乗算で
a_hi * b_hi を求めてから、
本当の a_hi * b_hi との誤差を求めるところ
c_hi = a_hi * b_hi とやってから
a_hi * b_hi - c_hi
をFMAでやれば誤差が簡単に求まる
{a_hi, a_lo} と {b_hi, b_lo} の乗算で
a_hi * b_hi を求めてから、
本当の a_hi * b_hi との誤差を求めるところ
c_hi = a_hi * b_hi とやってから
a_hi * b_hi - c_hi
をFMAでやれば誤差が簡単に求まる
282デフォルトの名無しさん
2019/11/26(火) 23:19:37.46ID:78UVTJ0X fusedな3個の足し算命令とかもあると
加減算も簡単になるんだけど
そんな命令は(他のCPU含めて)見たことがない
加減算も簡単になるんだけど
そんな命令は(他のCPU含めて)見たことがない
283デフォルトの名無しさん
2019/11/26(火) 23:24:07.48ID:sE/nea3J a=1+q の時:
y/a=y/(1+q)
=y*{1 - q + q^2 - q^3 + ... }
=y*(1-q*(1-q*(1-q...))}
y/a=y/(1+q)
=y*{1 - q + q^2 - q^3 + ... }
=y*(1-q*(1-q*(1-q...))}
284デフォルトの名無しさん
2019/11/26(火) 23:30:51.74ID:sE/nea3J >>283
この式は、|q|<1の場合にだけ正しいので、
aをa=u*2^n (u = 1.0 + q)の形式に直してから
1/a = 1/(u*2^n)=1/(1+q)*2^(-n)
= (1-q*(1-q*(1-q...)))*2^(-n)
とするのですかね。
なるほど、qの精度を考えれば、乗算の回数は2個くらいまで
で済みそうですね。
この式は、|q|<1の場合にだけ正しいので、
aをa=u*2^n (u = 1.0 + q)の形式に直してから
1/a = 1/(u*2^n)=1/(1+q)*2^(-n)
= (1-q*(1-q*(1-q...)))*2^(-n)
とするのですかね。
なるほど、qの精度を考えれば、乗算の回数は2個くらいまで
で済みそうですね。
285デフォルトの名無しさん
2019/11/26(火) 23:36:41.80ID:sE/nea3J >>284
すみません、これだと二回では精度が足りなさそうですね。
すみません、これだと二回では精度が足りなさそうですね。
286デフォルトの名無しさん
2019/11/26(火) 23:37:21.85ID:78UVTJ0X287デフォルトの名無しさん
2019/11/26(火) 23:49:53.60ID:sE/nea3J >>286
多倍長の 1/a はどうやって求めたら効率が良いのでしょうか?
多倍長の 1/a はどうやって求めたら効率が良いのでしょうか?
288デフォルトの名無しさん
2019/11/26(火) 23:53:50.60ID:78UVTJ0X289デフォルトの名無しさん
2019/11/27(水) 00:00:48.09ID:T7KqQ5kC290デフォルトの名無しさん
2019/11/27(水) 00:02:25.36ID:T7KqQ5kC >>289
すみません、違いますね。
すみません、違いますね。
291デフォルトの名無しさん
2019/11/27(水) 00:27:57.72ID:tKRTExPe 初歩的な質問ですみません
2つのdouble型実数xとyを引数とし、x/yとy/xの大きい方を返却する関数を作成せよ。xあるいはyのときは0を返却するとする。という問題でコード書いてみたんですがうまくいきません どこが間違っているのでしょうか
#include<stdio.h>
double func(double,double); /*プロトタイプ宣言*/
int main(void)
{
double a,b;
printf("実数をスペースで区切って入力してください\n");
scanf("%d %d",&a,&b);
printf("%d",func(a,b)); /*呼び出し*/
return 0;
}
double func(double x,double y)
{
if(x/y > y/x) return x/y;
if(y/x > x/y) return y/x;
if(x==0) return 0;
if(y==0) return 0;
}
2つのdouble型実数xとyを引数とし、x/yとy/xの大きい方を返却する関数を作成せよ。xあるいはyのときは0を返却するとする。という問題でコード書いてみたんですがうまくいきません どこが間違っているのでしょうか
#include<stdio.h>
double func(double,double); /*プロトタイプ宣言*/
int main(void)
{
double a,b;
printf("実数をスペースで区切って入力してください\n");
scanf("%d %d",&a,&b);
printf("%d",func(a,b)); /*呼び出し*/
return 0;
}
double func(double x,double y)
{
if(x/y > y/x) return x/y;
if(y/x > x/y) return y/x;
if(x==0) return 0;
if(y==0) return 0;
}
292デフォルトの名無しさん
2019/11/27(水) 00:33:48.17ID:ynQDuheL %dのところがおかしい
それは整数用
それは整数用
293デフォルトの名無しさん
2019/11/27(水) 00:42:47.79ID:tKRTExPe ありがとうございます 1時間くらい悩んでたのが馬鹿みたいだ
294デフォルトの名無しさん
2019/11/27(水) 00:53:21.44ID:ynQDuheL 入力に0を含めてテストするように
295デフォルトの名無しさん
2019/11/27(水) 01:11:14.78ID:tKRTExPe ifの順番変えたら完成しました
296デフォルトの名無しさん
2019/11/27(水) 02:13:53.15ID:XGkmLsxS QZは馬鹿
297デフォルトの名無しさん
2019/11/27(水) 02:41:24.38ID:Q9FMbuzn xとyが等しいケースは書いたんじゃろうか
298デフォルトの名無しさん
2019/11/27(水) 11:43:48.59ID:g3LmaZYt 世にある仕事の数でいうと
java:C#:C++が5:3:1くらいだな。
java:C#:C++が5:3:1くらいだな。
299デフォルトの名無しさん
2019/11/27(水) 12:16:41.56ID:zdI/1sLa このスレ過疎かと思ったら話題でた途端に加速するな
300デフォルトの名無しさん
2019/11/27(水) 13:47:03.06ID:KtqS+hCI const は要らない子
301デフォルトの名無しさん
2019/11/27(水) 14:58:41.90ID:vSkP4LPU 本当はね・・・constの逆が欲しいのさ
デフォが書き込み禁止で許可を明示だったらと
キャプチャのmutableみたいな
デフォが書き込み禁止で許可を明示だったらと
キャプチャのmutableみたいな
302デフォルトの名無しさん
2019/11/27(水) 15:05:41.36ID:Yu9S3/3Y めんどくさいだけ
303デフォルトの名無しさん
2019/11/27(水) 15:08:54.83ID:lAIqGT0K Pointという点を表すクラスがあって、2点間の距離を取得する関数を追加したいのですが、
double Point::GetDistance(const Point &p) const
にすべきか、ただのCの関数で
double GetDistance(const Point &p1, const Point &p2)
にしたほうがいいのか迷っています。
設計的にいいのはどっちなんでしょうか?
double Point::GetDistance(const Point &p) const
にすべきか、ただのCの関数で
double GetDistance(const Point &p1, const Point &p2)
にしたほうがいいのか迷っています。
設計的にいいのはどっちなんでしょうか?
304デフォルトの名無しさん
2019/11/27(水) 15:13:19.55ID:zdI/1sLa305デフォルトの名無しさん
2019/11/27(水) 15:32:27.13ID:FMRbYBnJ 下に1票。同じ理由
306デフォルトの名無しさん
2019/11/27(水) 15:33:34.15ID:vYtjQlD0 下だな
なんでもかんでもインスタンスに生やすのは厨臭くてダサいし、対称な操作は対象に見えるべき
なんでもかんでもインスタンスに生やすのは厨臭くてダサいし、対称な操作は対象に見えるべき
307デフォルトの名無しさん
2019/11/27(水) 15:34:48.68ID:lAIqGT0K308デフォルトの名無しさん
2019/11/27(水) 15:43:43.07ID:PahKH909 下の方が、スカラー値等の既存型や配列向けの特殊化をし易いメリットもあるかもねー
309デフォルトの名無しさん
2019/11/27(水) 15:55:14.01ID:xImtWZAs ベクトルの引き算を定義してやるのはありでは
310デフォルトの名無しさん
2019/11/27(水) 16:11:06.28ID:KtqS+hCI311デフォルトの名無しさん
2019/11/27(水) 16:12:16.87ID:KtqS+hCI ああ同じではないわ
ベクトルの引き算はスカラーじゃなくてベクトル
ベクトルの絶対値を定義する
ベクトルの引き算はスカラーじゃなくてベクトル
ベクトルの絶対値を定義する
312デフォルトの名無しさん
2019/11/27(水) 16:29:07.34ID:MN5dlGGA abs(a-b)
313デフォルトの名無しさん
2019/11/27(水) 18:11:30.16ID:p98u22dC ベクトルの加減算や符号は紛れが無いのでオペレータで実装
乗算は内積、外積と要素ごとの積の3種類あるので
関数にする
3次元ベクトルも作る可能性があるなら
2次元ベクトルだとわかる名前にしておく
可能性が無いならそのままで
絶対値やノルム、象限などをグローバルにするかメンバ関数にするかは一長一短
設計ポリシー次第
乗算は内積、外積と要素ごとの積の3種類あるので
関数にする
3次元ベクトルも作る可能性があるなら
2次元ベクトルだとわかる名前にしておく
可能性が無いならそのままで
絶対値やノルム、象限などをグローバルにするかメンバ関数にするかは一長一短
設計ポリシー次第
315デフォルトの名無しさん
2019/11/27(水) 19:21:07.28ID:fyVQDs9d316デフォルトの名無しさん
2019/11/27(水) 19:29:28.78ID:vSkP4LPU317デフォルトの名無しさん
2019/11/27(水) 19:31:20.95ID:nSz8Pwyp318デフォルトの名無しさん
2019/11/27(水) 19:40:34.02ID:nSz8Pwyp RTOSを使うような小規模環境だと
ヒープをしなかったりアロケートのみにしたりする
そんな環境でもC++は便利なので使えるなら使いたい
ヒープをしなかったりアロケートのみにしたりする
そんな環境でもC++は便利なので使えるなら使いたい
319デフォルトの名無しさん
2019/11/27(水) 19:40:48.50ID:nSz8Pwyp ヒープを搭載しなかったり
320デフォルトの名無しさん
2019/11/27(水) 19:48:12.34ID:nSz8Pwyp OSレスでもC++が使えるなら使う
実際それで製品出した
実際それで製品出した
321デフォルトの名無しさん
2019/11/27(水) 19:52:22.88ID:q8B3tEUN 対称が大事なのって、交換法則が成り立つ計算だから?
322デフォルトの名無しさん
2019/11/27(水) 19:54:03.88ID:nSz8Pwyp 引き算の立場は?
323デフォルトの名無しさん
2019/11/27(水) 19:57:18.53ID:nSz8Pwyp 主役がはっきりしてる場合はメンバ
同等な重要度の時は非メンバ
私の場合はだいたいこんな感じ
同等な重要度の時は非メンバ
私の場合はだいたいこんな感じ
324デフォルトの名無しさん
2019/11/27(水) 19:58:30.31ID:nSz8Pwyp 対称かどうかはあまり関係ない
325デフォルトの名無しさん
2019/11/27(水) 20:25:32.56ID:vYtjQlD0 対称性が特に問題になるのはオペランドの型が異なるケースだな
対称な演算a.op(b)をaのクラスに実装したらbのクラスにも同じものをコピペするのか?
C#の演算子オーバーロードがstaticなのはそのへんが理由だとか
Pythonなどのスクリプト言語では基本的にインスタンスメソッドとして演算子を実装するけど、
それは動的型故に事前に実装を解決できないからだね
対称な演算a.op(b)をaのクラスに実装したらbのクラスにも同じものをコピペするのか?
C#の演算子オーバーロードがstaticなのはそのへんが理由だとか
Pythonなどのスクリプト言語では基本的にインスタンスメソッドとして演算子を実装するけど、
それは動的型故に事前に実装を解決できないからだね
326デフォルトの名無しさん
2019/11/27(水) 20:29:53.87ID:EGeQZX97 >>317
かつて非メンバ関数のオペレータを名前空間の外から呼び出そうとするととても残念な気持ちになるからじゃね
かつて非メンバ関数のオペレータを名前空間の外から呼び出そうとするととても残念な気持ちになるからじゃね
327デフォルトの名無しさん
2019/11/27(水) 20:44:42.44ID:0U9h+SK3 オペレータオーバーロードを使うとカッコイイ気分にひたれるからだろ
それ以外の理由なんてあるのか?
それ以外の理由なんてあるのか?
328デフォルトの名無しさん
2019/11/27(水) 20:45:44.57ID:E2H9effp private変数の書き換えを伴うものだけメンバだな
Pointが座標値しか持ってないようなのならコンストラクタ以外は持たせない
Pointが座標値しか持ってないようなのならコンストラクタ以外は持たせない
329デフォルトの名無しさん
2019/11/28(木) 01:38:08.55ID:PoPpbfsh 代入は普通メンバだろ
=
+=
-=
*=
/=
[ ]も
=
+=
-=
*=
/=
[ ]も
■ このスレッドは過去ログ倉庫に格納されています
