我想将双精度数转换为十进制数.
例如我有23.43,双值将是(使用matlab):174 71 255 122 20 110 55 64现在有这个如何编写一个给我23.43的java程序?
这里是matlab中双精度的计算:
MATLAB根据IEEE标准754构造双精度的双精度数据类型.存储为double的任何值都需要64位,格式如下表所示:
比特用法
63符号(0 =正,1 =负)
62至52指数,偏向1023
51到0数字1.f的分数f
将数字从双精度浮点格式转换为单精度浮点格式会导致精度损失.用于实现此转换的算法是什么?
数字是大于3.4028234e+38还是小于-3.4028234e+38简单地减少到各自的限制?我觉得转换过程比这更复杂,但我找不到它的文档.
floating-point type-conversion double-precision ieee-754 single-precision
我试图理解Matlab中的双精度数.为什么这个1 - 3*(4/3 - 1)不等于零?
floating-point matlab floating-accuracy double-precision ieee-754
我想要乘以这个数字:
5374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487
用这个数字:
4956889911565576581818287977011111065876967103548749122901151091038910610511189
但是当我将结果转换为字符串时,我得到了这个:
2.66418508698446E + 201
这是:
266418508698446000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000
不完全是精确的数字,那些零表示精度损失,我是对的吗?
是否可以使用C#从该计算中获得精确数字(每一位数字)?
谢谢
我想计算0.95的值.这是我的方法:
public static final int VAR = 5;
private static double getDouble(){
double dis = (double)(VAR/100);
dis = (double)(1-dis);
return dis;
}
Run Code Online (Sandbox Code Playgroud)
但是,它输出1.0 ?? 如果我在main方法中键入相同的代码,我得到0.95.我的错误在哪里?
我必须将整数值乘以 2^31。我用谷歌搜索了一下,看起来双打的范围在 2.23e-308 <= |X| 之间 使用 64 位时 <= 1.79e308,并且是 1.18e-38 <= |X| 之间的浮点数 <= 3.40e38。
这比我需要的要多得多。但这不起作用。
我的头文件中有这个常量值:
static const float SCALE_FACTOR = 2^-31;
Run Code Online (Sandbox Code Playgroud)
如果那么我就这样做:
float dummy = SCALE_FACTOR;
Run Code Online (Sandbox Code Playgroud)
那么,dummy 的值为 11。
我不知道问题是否在于分配这样的常量值,但我不知道如何在不损失精度的情况下编写它。
有什么帮助吗?
编辑:抱歉,愚蠢的问题。我的 MatLab 背景背叛了我,忘记了 ^ 在 C++ 中不是用于求幂。我已投票结束。
c++ floating-point double double-precision floating-point-precision
使用以下2个函数关注具有*注释的行.当cout <<语句执行时,没有显示小数位.3021680380/10000000变为302.而不是302.1680.
void convert(){
setprecision(4); //************************
newFileTime = new double[numRec]; //***********
newOffset = new int[numRec];
newSize = new int[numRec];
newNum = new int[numRec];
newType = new int[numRec];
newTime = new int[numRec];
for(int i = 0; i<numRec; i++){
newFileTime[i] = fileTime[i] / 10000000; //**********
newOffset[i] = offset[i] / 512;
newSize[i] = fileSize[i] / 512;
newNum[i] = 0;
if(type[i] == "Write"){
newType[i] = 0;
}else{
newType[i] = 1;
}
newTime[i] = responseTime[i] / 10000000;
}
}
void exports(){
setprecision(4); //**************
ofstream fout; …Run Code Online (Sandbox Code Playgroud) 尝试打印多于15个小数位的PI结果会导致在第15个小数位之后打印不正确的小数。尽管分配了30个正确的十进制值,并且使用long double来保留该值。以下测试案例清楚地显示了该错误。
这是出乎意料的。如果数字中有任何错误,我希望在用尽IEEE-754位数之后直到第25位都不会看到任何错误。这里发生的是什么规则可能可以解释,我无法打印回我刚刚分配给以下sPI的相同30位数字。这也会影响打印中M_PI包含的表示形式的能力math.h。
#include <stdio.h>
int
main (void) {
// static PI approximation (glibc man 1.17)
long double sPI = 3.14159265358979323846264338327;
char strPI[] = "3.14159265358979323846264338327";
printf ("\n %s (strPI - string - correct)\n", strPI);
printf (" %.29Lf (sPI - long double - INCORRECT)\n\n", sPI);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
输出:
3.14159265358979323846264338327 (strPI - string - correct)
3.14159265358979311599796346854 (sPI - long double - INCORRECT)
^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
大概,此十进制错误将适用于精度大于16的任何十进制数字。当以字符串形式打印时,PI可以正常打印(显然),但是以双精度形式打印时-小数精度会在第15个小数点后下降。是什么原因造成的?
非常有趣,正如建议L在浮点文字的末尾添加一个确实有帮助:
3.14159265358979323846264338327 (strPI - string - correct) …Run Code Online (Sandbox Code Playgroud) 我试图用c ++创建我的第一堂课.我正在调用文件geometryitems.cpp并执行此操作:
using namespace std;
class Point
{
double x, y, z;
public:
// constructor
Point(double x, double y, double z)
{
}
// copy constructor
Point(const Point& pnt)
{
x = pnt.x;
y = pnt.y;
z = pnt.z;
}
void display()
{
cout << "Point(" << x << ", " << y << ", " << z << ")";
}
};
Run Code Online (Sandbox Code Playgroud)
然后我从另一个文件中调用它:
#include <iostream>
#include <cstdio>
#include "geometryitems.cpp"
using namespace std;
int main()
{
// initialise object …Run Code Online (Sandbox Code Playgroud)