相关疑难解决方法(0)

在MATLAB中,默认情况下变量是否真的是双精度?

这个问题产生于我在进一步调查这个问题后发现的一些奇怪的事情......

我总是将MATLAB变量理解为默认的双精度.所以,如果我要做一些事情,比如声明一个小数点后20位数的变量:

>> num = 2.71828182845904553488;
>> class(num)  % Display the variable type
ans =
double
Run Code Online (Sandbox Code Playgroud)

我希望忽略最后4位数,因为浮点相对精度大约为10 -16:

>> eps(num)
ans =
    4.440892098500626e-016
Run Code Online (Sandbox Code Playgroud)

如果我尝试在小数点后面显示超过16位的数字(使用fprintf或者sprintf),我得到的结果是:

>> fprintf('%0.20f\n', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000
Run Code Online (Sandbox Code Playgroud)

换句话说,数字17到20都是0.

但是,事情变得奇怪,当我传球num可变精度算术函数符号工具箱,告诉它表示使用的精度21个的位数:

>> vpa(num, 21)
ans =
2.71828182845904553488
Run Code Online (Sandbox Code Playgroud)

什么?!最后4位数字再次出现!当我输入的原始数字存储为双精度变量时,它们是否应该丢失num?既然num传递给它是一个双精度变量vpa,怎么vpa知道它们是什么?

我最好的猜测是,MATLAB内部表示的num精度高于双精度,因为我将它初始化为一个数字,其数字超过小数点,而不是双精度变量可以处理的数字.这真的是发生了什么,还是正在发生的事情?



奖励:如果你还没有上述的偏头痛,这里还有另外一个混乱的根源......

>> num = 2.71828182845904553488;  % Declare …
Run Code Online (Sandbox Code Playgroud)

variables floating-point precision matlab

72
推荐指数
1
解决办法
3万
查看次数

如何在java中将float转换为double?

我在java中编写以下代码并检查存储在变量中的值.当我在一个双变量'y'中存储1.2时,它变为1.200000025443.为什么不是1.2亿个?

public class DataTypes

{
    static public void main(String[] args)
    {
        float a=1;
        float b=1.2f;
        float c=12e-1f;
        float x=1.2f;
        double y=x;

        System.out.println("float a=1 shows a= "+a+"\nfloat b=1.2f shows b= "+b+"\nfloat c=12e-1f shows c= "+c+"\nfloat x=1.2f shows x= "+x+"\ndouble y=x shows y= "+y);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到输出:

float a=1 shows a= 1.0
float b=1.2f shows b= 1.2
float c=12e-1f shows c= 1.2
float x=1.2f shows x= 1.2
double y=x shows y= 1.2000000476837158

java

7
推荐指数
1
解决办法
757
查看次数

OCaml如何管理浮动添加?

在Java中,如果你这样做0.2 + 0.01,你会得到0.21000000000000002

这是由于IEEE 754.

但是,在OCaml中,如果这样做0.2 +. 0.01,那么您将获得正确的结果0.21.

我认为OCaml也遵循IEEE 754 for floats,为什么OCaml可以提供正确的结果而Java不能?

floating-point ocaml

1
推荐指数
2
解决办法
467
查看次数

标签 统计

floating-point ×2

java ×1

matlab ×1

ocaml ×1

precision ×1

variables ×1