質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

3183閲覧

演算結果が-0になる原因とは?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/05/06 11:37

編集2020/05/06 12:04

提示コードの**/-----------------------外積 ベクトル x ベクトル------------------------------------------------/**のofsでテキストファイルに注力してします(提示画像)です。外積のコードです。画像のx,y,z のxですがなぜ-0なのでしょうか?数学上は 0 * -20は 0 になるはずですが...それはまた別としてなぜ0にはならないのでしょうか?コンソールアプリを作成して実験しましたが値は0になりました(float型)です。

※DXライブラリ(DirectX)だからでしょうか?

イメージ説明

コンソールアプリ

int main() { Vector a(0.0f,0.0f,0.0f); //Vector magnitude = sqrt(Vector::dot(a, b)); //Vector magnitude = normalize(a); //float f = 0 / 0; float f = 0.0f; f = 0.0f * -20.0f; printf("%f",&f); int _ch = getchar(); return 0; }

Vector.cpp

#include "Vector.hpp" #include "DxLib.h" #include <fstream> /*ベクトル x スカラーの掛け算*/ Vector Vector::mul_scalar(float a, Vector v) { return Vector(a * v.x,a * v.y,a * v.z); } /*外積 ベクトル x ベクトル*/ Vector Vector::cross(Vector a,Vector b) { return Vector( (a.y * b.z) - (a.z * b.y), (a.z * b.x) - (a.x * b.z), (a.x * b.y) - (a.y * b.x)); } /*-----------------------外積 ベクトル x ベクトル------------------------------------------------*/ VECTOR Vector::cross(VECTOR a, VECTOR b) { const char* filename = "Log.txt"; std::ofstream ofs(filename); VECTOR v; v.x = (a.y * b.z) - (a.z * b.y); ofs << " いいいいいいいい : (" << a.y << " * " << b.z << ") - (" << a.z << " * " << b.y <<") "<< std::endl; v.y = (a.z * b.x) - (a.x * b.z); v.z = (a.x * b.y) - (a.y * b.x); ofs << " あああああv : " << v.x << " , " << v.y << " , " << v.z << std::endl; return v; } /*-------------------------------------------------------------------------------------------------*/ Vector Vector::operator - (Vector v) { return Vector( (x - v.x) , (y - v.y), (z - v.z) ); } /*内積*/ float Vector::dot(Vector a, Vector b) { return (a.x * b.x) + (a.y * b.y) + (a.z * b.z); } /*内積*/ float Vector::dot(VECTOR a, VECTOR b) { return (a.x * b.x) + (a.y * b.y) + (a.z * b.z); } /*コンストラクタ*/ Vector::Vector(float xx,float yy,float zz) { x = xx; y = yy; z = zz; } /*tagVECTOR tと自作vector を比較*/ Vector Vector::operator = (tagVECTOR t) { this->x = t.x; this->y = t.y; this->z = t.z; return *this; } /*コンストラクタ*/ Vector::Vector() { x = 0.0f; y = 0.0f; z = 0.0f; } /*オペレーター = */ Vector Vector::operator = (Vector v) { this->x = v.x; this->y = v.y; this->z = v.z; return *this; } /*オペレーター + */ Vector Vector::operator + (Vector v) { Vector t; t.x = this->x + v.x; t.y = this->y + v.y; t.z = this->z + v.z; return t; } /*コンストラクタ 実部、虚部(Vector) */ Quaternion::Quaternion(float aa, Vector vv) { a = aa;//実部 /*虚部*/ v = vv; } /*コンストラクタ 引数なし*/ Quaternion::Quaternion() { a = 0.0f;//実部 /*虚部*/ v.x = 0.0f; v.y = 0.0f; v.z = 0.0f; } /*クォータニオン同士の掛け算 A = (a; U) B = (b; V) AB = (ab - U・V; aV + bU + U×V) */ Quaternion Quaternion::operator * ( Quaternion t ) { return Quaternion(this->a * t.a - Vector::dot(this->v,t.v),Vector(Vector::mul_scalar(this->a,t.v) + Vector::mul_scalar(t.a,this->v) + Vector::cross(this->v,t.v))); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/05/06 12:04

>数学上は 0 * -20は 0 になるはずです ・・・何故そう思われたのでしょうか?(異符号同士の乗算は、負数になると思いますが・・・)
退会済みユーザー

退会済みユーザー

2020/05/06 12:11

なるほど。Googleのトップページに-20 * 0とう入れてみたのですが0になるのでどっからマイナスが出てのか気になりました。
cateye

2020/05/06 12:24

私の手元に有る電卓(Galculator:linuxの電卓アプリ)では、0*-20は-0になります。
退会済みユーザー

退会済みユーザー

2020/05/06 12:42

質問ですが、その後の計算等に関わるのでしょうか?
cateye

2020/05/06 13:20

−0は通常の0として認識されるようです・・・加算減算の場合。乗算/除算は-0のまま。
guest

回答1

0

ベストアンサー

(現在一般的な)浮動小数点数の演算は数学とは少々異なり、+0と-0が別に存在します。
-0に関わる演算は明確に定義されており、例えば+0に負の数を掛けると-0になります。
これを文字列として出力する時どう出力するかはまた別の話で、環境によって「-0」を単に「0」と出力するものも明示的に「-0」と出力するものもあるということでしょう。

参考: Wikipedia IEEE 754における負のゼロ

投稿2020/05/06 12:11

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/06 12:15

質問ですが その後の演算には影響しないということでしょうか?つまりは0ということでいいのでしょうか?
ikadzuchi

2020/05/06 12:26

基本的に何か演算する時+0と-0は同じものとして扱われます。違いが出るのは無限が絡む時くらいかなと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問