C++關於不同精度數值處理

要求:有2組數據,一組有節點編號和座標,另一組只有節點座標和結果值(節點座標精度不一樣),要求匹配節點編號和結果值。

想法1:本來想通過將座標轉爲統一精度,再組成字符串,通過QMap<QString,int>有序查找編號,但發現不同精度的結果統一精度後不一樣。

//用QString::number方法對於不同精度的數舍入方法未知,如:

QString str1 = "5.8122662353515625e+02";

QString str2 = "5.812266235E+02";

QString result1 = QString::number(str1.toDouble(), 'e', 8);

QString result2 = QString::number(str2.toDouble(), 'e', 8);

cout << str1.toDouble() << endl << str2.toDouble() << endl;

//結果:5.81226624e+2

 // 5.81226623e+2

//用C語言的sprintf結果對於這組數據不太一樣,但其他數據也有類似情況,說明這個想法不可行。

想法2:同QHash<XYZ,int>,其中XYZ爲自定義類,保存節點座標。QHash用自定義類作爲key時,要重載==運算符,並且要有一個全局qHash函數:

header.h:

#ifndef HEADER_H
#define HEADER_H
#include <math.h>
#include <QString>
#include <QHash>
class XYZ
{
public:
    XYZ(double x,double y,double z)
    {
        this->x=x;
        this->y=y;
        this->z=z;
    }

    double x,y,z;

    bool operator==(const XYZ& obj) const 
	{
        double torrent = pow(0.1f, 10);
        if (abs(this->x - obj.x) < torrent && abs(this->y - obj.y) < torrent && abs(this->z - obj.z) < torrent)
            return true;
        else
            return false;
    }
};

uint qHash(const XYZ &key, uint seed);

#endif // HEADER_H

xyz.cpp:

#include "header.h"
uint qHash(const XYZ &key, uint seed)
{
    QString str=QString::number(key.x, 10, 4) + QString::number(key.y, 10, 4) + QString::number(key.y, 10, 4);
    return qHash(str, seed);
}
//main.cpp
#include <QCoreApplication>
#include <iostream>
#include "header.h"
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QHash<XYZ,int> maps;
    maps.insert(XYZ(1,1,1),1);
    cout<<maps[XYZ(1,1,1)]<<endl;
    return a.exec();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章