相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

为什么在MATLAB中24.0000不等于24.0000?

我正在编写一个程序,我需要删除存储在矩阵中的重复点.问题在于,当检查这些点是否在矩阵中时,MATLAB不能在矩阵中识别它们,尽管它们存在.

在以下代码中,intersections函数获取交集点:

[points(:,1), points(:,2)] = intersections(...
    obj.modifiedVGVertices(1,:), obj.modifiedVGVertices(2,:), ...
    [vertex1(1) vertex2(1)], [vertex1(2) vertex2(2)]);
Run Code Online (Sandbox Code Playgroud)

结果:

>> points
points =
   12.0000   15.0000
   33.0000   24.0000
   33.0000   24.0000

>> vertex1
vertex1 =
    12
    15

>> vertex2    
vertex2 =
    33
    24
Run Code Online (Sandbox Code Playgroud)

应从结果中消除两点(vertex1vertex2).它应该通过以下命令完成:

points = points((points(:,1) ~= vertex1(1)) | (points(:,2) ~= vertex1(2)), :);
points = points((points(:,1) ~= vertex2(1)) | (points(:,2) ~= vertex2(2)), :);
Run Code Online (Sandbox Code Playgroud)

在这之后,我们有了这个意想不到的结果:

>> points
points =
   33.0000   24.0000
Run Code Online (Sandbox Code Playgroud)

结果应该是一个空矩阵.如你所见,第一对(或第二对)[33.0000 24.0000]已被淘汰,但不是第二对.

然后我检查了这两个表达式:

>> points(1) ~= vertex2(1)
ans …
Run Code Online (Sandbox Code Playgroud)

floating-point precision matlab

67
推荐指数
4
解决办法
2万
查看次数

为什么ColdFusion中0.06 + 0.01 = 0.07?

为什么ColdFusion中的数学运算似乎不受浮点数学问题的影响?拿代码:

result = 0.06 + 0.01;

writedump(result);
writedump(result.getClass().getName());
Run Code Online (Sandbox Code Playgroud)

哪个输出

0.07

java.lang.Double中

然而,相当的Java代码产生了我在添加两个双精度时所期望的:

public static void main(String[] args) {
    double a = 0.01d;
    double b = 0.06d;

    System.out.println(a + b); //0.06999999999999999
}
Run Code Online (Sandbox Code Playgroud)

这是我期望从ColdFusion看到的,因为浮动数学的现实(http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html).

ColdFusion在幕后做了一些"魔术"还是我在这里看到一个孤立的异常?

java coldfusion floating-point-precision cfml

28
推荐指数
1
解决办法
1315
查看次数

(0.3)^ 3 ==(0.3)*(0.3)*(0.3)在matlab中返回false?

我试图理解MATLAB中基本算术运算的舍入误差,我遇到了以下奇怪的例子.

(0.3)^3 == (0.3)*(0.3)*(0.3)

ans = 0
Run Code Online (Sandbox Code Playgroud)

我想确切地知道如何计算左侧.MATLAB文档表明,对于整数幂,使用"通过平方取幂"算法.

"矩阵功率.如果p是标量,则X ^ p是功率p的X.如果p是整数,则通过重复平方来计算功率."

所以,我认为(0.3)^3(0.3)*(0.3)^2会返回相同的值.但这种情况并非如此.如何解释舍入误差的差异?

floating-point matlab

19
推荐指数
2
解决办法
501
查看次数

Matlab代码中的奇怪之处

我试着编译以下代码.

x = 0
while x <= 1
    x = x+0.02
end
Run Code Online (Sandbox Code Playgroud)

我应该得到的x的最后一个值等于1.02(这在while循环中是一个错误的条件)

但是,我非常想知道我总是将x的最后一个值等于1并且while循环停止.我不知道我的代码有什么问题.谁有人可以帮我找出来?

matlab

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

0
推荐指数
1
解决办法
1857
查看次数