合計 昨日 今日

ISLe
 
記事: 2593
登録日時: 2010年10月16日(土) 22:47
日記: 日記を見る (19)
日記
- 11月 2017
アクセス元の情報 (0)
   2017年11月23日(木) 18:15
オブジェクト指向とモダン言語 (5)
   2017年11月23日(木) 18:00

+ 10月 2017
+ 8月 2017
+ 12月 2016
+ 4月 2014
+ 7月 2011
+ 6月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
+ 10月 2010
フォロー
カテゴリー
フィード
次へ

アクセス元の情報

パーマリンクby ISLe on 2017年11月23日(木) 18:15

いまどき、何をもって同一人物と判断しているのか。

ちなみに、これはどこから書き込んでいるか分かるのだろうか。

コメント数: 0 閲覧数: 203

オブジェクト指向とモダン言語

パーマリンクby ISLe on 2017年11月23日(木) 18:00

オブジェクト指向言語は、オブジェクト指向プログラミングをネイティブにサポートできるようにデザインされた言語。
そのデザインを学ぶことでオブジェクト指向の目指すところが見えてくる。
Offtopic :
それとは別にオブジェクト指向を体現するようにデザインされたオブジェクト指向言語もある。
こちらはしばしば“純粋オブジェクト指向言語”と呼称される。


言い古されたことだが、オブジェクト指向言語を使ってプログラミングすればオブジェクト指向になるわけではない。
C++の代わりにJavaを使おうがC#を使おうが同じことだ。

モダン言語は標準搭載の機能だけでできることが多い。
それを使ってできることが増えても、自分がオブジェクト指向を理解したと勘違いしてはいけない。

C++で使用するライブラリに振り回される。
それは抽象化が下手くそだから、オブジェクト指向のセンスがないということだ。

クラスを使えばインテリセンスがより便利になる。
だからと言って、識別子をDefineクラスにひとまとめにしようなどと、センスのあるプログラマは考えない。

モダン言語のほとんどはC/C++で作られている。
C++を欠陥呼ばわりするのは「ケーキを食べればいいじゃない」を地で行ってる。

コメント数: 5 閲覧数: 385

エアプ

パーマリンクby ISLe on 2017年10月16日(月) 17:38

実際に開発したら分かることとか、実際にプレイしたら分かることとか、そういうところで頓珍漢なことをいう輩。

コメント数: 0 閲覧数: 434

浮動小数点数とGPL

パーマリンクby ISLe on 2017年8月31日(木) 17:35

DXライブラリはgcc用もあるが、gccが使用する標準ライブラリに三角関数でx87命令を使わないソフトウェア実装があるという。

x87命令が返す結果の正確性に問題があるため、より正確な結果を得られるのだそう(しかもx87命令より高速に)。

つまり、同じソースでもvcでコンパイルしたときとgccでコンパイルしたときでは動作が異なる場合があるということ。

floatだけでなくdoubleにも影響する。
Direct3Dと無関係。
#SIMD拡張命令使ってx87命令を使わないなら回避できるだろうけど。



ところで、GPLを採用したプログラムがVCでビルドしないと期待通り動かないとしたらどうなのだろう。
システム・ライブラリ例外に含まれるであろうソフトウェアに依存するのはGPLの想定外か?

自由でないライブラリを利用する自由ソフトウェアを書けますか?
GPLの採用を阻害する権利は誰にもないであろうが、↑に書かれているように
・gccでコンパイルしてもちゃんと動くようにする
あるいは
・gccでコンパイルするとちゃんと動かない可能性について明示し、gccでコンパイルしてもちゃんと動くよう改変することを提案する
という対応を取るのが適切であろう。
#現実としてはSIMD拡張命令使うようコンパイルオプションに言及すれば良いだけだろうけど。

コメント数: 0 閲覧数: 504

検証

パーマリンクby ISLe on 2017年8月30日(水) 18:08

Direct3Dコンポーネントの肥大化を解消するために、旧版のDirect3Dは最新のDirect3Dのラッパに構成し直す計画だというのをMicrosoft公式ブログで読んだ記憶がある。
Windows 10のカーネルサイズに絡んだ内容だったと思うのでDirect3D 12を対象にしたものだっただろうか。
Microsoft公式ブログのサイトが変わってしまって過去の記事を見付けるのが難しく断念。

Direct3D 9で浮動小数点数の演算精度が変化する問題はどうなる(どうなった)のか。
とりあえず現状はどうなっているか検証してみた。

検証のベースとなるコード。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "DxLib.h"
#include <float.h>
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //SetUseDirect3DVersion(DX_DIRECT3D_9);
    ChangeWindowMode(TRUE);
    if (DxLib_Init() != 0) return 0;
    SetDrawScreen(DX_SCREEN_BACK);
 
    double d = 0.1;
    float  f = 0.1f;
 
    unsigned int controlfp = _controlfp(0, 0);
 
    while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
    {
        DrawFormatString(0, 0,GetColor(255,255,255),"double: %.1f * %.1f = %.15g",d,d,d*d);
        DrawFormatString(0,20,GetColor(255,255,255),"float:  %.1f * %.1f = %.15g",f,f,f*f);
 
        switch (GetUseDirect3DVersion()) {
        case DX_DIRECT3D_9:
            DrawString(0,40,"DX_DIRECT3D_9",GetColor(255,255,255));
            break;
        case DX_DIRECT3D_9EX:
            DrawString(0,40,"DX_DIRECT3D_9EX",GetColor(255,255,255));
            break;
        case DX_DIRECT3D_11:
            DrawString(0,40,"DX_DIRECT3D_11",GetColor(255,255,255));
            break;
        }
 
        switch (controlfp & _MCW_PC) {
        case _PC_24:
            DrawString(0,60,"_PC_24",GetColor(255,255,255));
            break;
        case _PC_53:
            DrawString(0,60,"_PC_53",GetColor(255,255,255));
            break;
        case _PC_64:
            DrawString(0,60,"_PC_64",GetColor(255,255,255));
            break;
        }
    }
 
    DxLib_End();
    return 0;
}


Windows 10 Pro バージョン1703 64ビット
Visual Studio 2017 Community
DXライブラリ 3.18e

検証結果。
float.png
float.png (7 KB) 表示数: 142 回


上から
1. DXライブラリ・VCのコンパイルオプション共にデフォルト
2. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションはデフォルト
3. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションに/arch:IA32を指定

1.
現在のDXライブラリは、Direct3D 11が使えるときはDirect3D 11を使う。
Microsoftのサポートが継続していて最も古いWindows 7でDirect3D 11は標準搭載である。
浮動小数点数演算の精度変化が発生するのはDirect3D 9であり、Direct3D 11では発生しない。
2.
Visual Studio 2012以降、/arch:SSE2オプションが既定となり、浮動小数点数の演算にSIMD拡張命令が使用される。
Direct3D 9で浮動小数点数演算の精度変化が発生する対象はx87(FPU)命令であり、 SIMD拡張命令に影響しない。
#64ビットターゲットでは常にSIMD拡張命令が使用される。
Offtopic :
MSDNライブラリの/archオプションの説明だと、/arch:SSE2としてもx87命令が完全に排除されるとは限らないように読める。ちょっとしたコードの変化でも演算結果に影響を与える可能性はあるということか。

3.
SIMD拡張命令を使用しないようにしてやっと浮動小数点数演算の精度変化が確認できた。

SetUseDirect3DVersion関数でDX_DIRECT3D_9EXを指定した場合も同様であった。

いまのところ、32ビットターゲットでDirect3D 9/Direct3D 9Exデバイスを作成するプログラムを/arch:IA32オプションを付けてビルドするとまだ再現するということが確認できた。
Windows XPで動作させたいといった目的でもなければもはやあり得ない組み合わせだと思う。
この情報が何かの役に立つだろうか。
添付ファイル

コメント数: 2 閲覧数: 646

オンラインデータ

登録ユーザー: なし