在下面的代码中,为什么与float.Epsilon进行比较而不是0?
// Coroutine to move elements
protected IEnumerator SmoothMovement (Vector3 end)
{
// Distance computation
float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
while(sqrRemainingDistance > float.Epsilon)
{
Vector3 newPostion = Vector3.MoveTowards(
rb2D.position, end, inverseMoveTime * Time.deltaTime
);
rb2D.MovePosition (newPostion);
sqrRemainingDistance = (transform.position - end).sqrMagnitude;
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud) 我在使用浮点变量时听说过"错误".现在我正在尝试解决这个难题,我想我得到了一些舍入/浮点错误.所以我最终要弄清楚浮点错误的基础知识.
什么是浮点/舍入误差的简单示例(最好是在C++中)?
编辑:例如说我有一个成功概率为p的事件.我做了10次此事件(p没有变化,所有试验都是独立的).两次成功试验的概率是多少?我把它编码为:
double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
Run Code Online (Sandbox Code Playgroud)
这是浮点错误的机会吗?
我有一个非常恼人的问题,在Java中有很多浮点数或双打数.基本上这个想法是,如果我执行:
for ( float value = 0.0f; value < 1.0f; value += 0.1f )
System.out.println( value );
Run Code Online (Sandbox Code Playgroud)
我得到的是:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
Run Code Online (Sandbox Code Playgroud)
我明白浮动精度误差的积累,但是,如何摆脱这个?我尝试使用双打错误的一半,但结果仍然相同.
有任何想法吗?
对于大商,整数除(//)似乎不一定等于常规除(math.floor(a/b))的最低值.
根据Python文档(https://docs.python.org/3/reference/expressions.html - 6.7),
整数的平面划分产生整数; 结果是数学除法的结果,"floor"函数应用于结果.
然而,
math.floor(648705536316023400 / 7) = 92672219473717632
648705536316023400 // 7 = 92672219473717628
Run Code Online (Sandbox Code Playgroud)
'{0:.10f}'.format(648705536316023400 / 7) 收益率'92672219473717632.0000000000',但小数部分的最后两位数应为28而不是32.
你如何向仍然认为计算机是无限智能和准确的新鲜程序员和外行人解释浮点不准确?
你有一个最喜欢的例子或轶事似乎比一个精确但干燥的解释更好地理解这个想法吗?
这是如何在计算机科学课程中教授的?
我有一个MEMS IMU,我一直在收集数据,我正在使用pandas从中获取一些统计数据.每个循环收集6个32位浮点数.对于给定的集合运行,数据速率是固定的.数据速率在100Hz和1000Hz之间变化,收集时间长达72小时.数据保存在平面二进制文件中.我这样读了数据:
import numpy as np
import pandas as pd
dataType=np.dtype([('a','<f4'),('b','<f4'),('c','<f4'),('d','<f4'),('e','<f4'),('e','<f4')])
df=pd.DataFrame(np.fromfile('FILENAME',dataType))
df['c'].mean()
-9.880581855773926
x=df['c'].values
x.mean()
-9.8332081
Run Code Online (Sandbox Code Playgroud)
-9.833是正确的结果.我可以创建一个类似的结果,有人应该能够这样重复:
import numpy as np
import pandas as pd
x=np.random.normal(-9.8,.05,size=900000)
df=pd.DataFrame(x,dtype='float32',columns=['x'])
df['x'].mean()
-9.859579086303711
x.mean()
-9.8000648778888628
Run Code Online (Sandbox Code Playgroud)
我在Linux和Windows上,在AMD和Intel处理器上,在Python 2.7和3.5中重复了这一点.我很难过.我究竟做错了什么?得到这个:
x=np.random.normal(-9.,.005,size=900000)
df=pd.DataFrame(x,dtype='float32',columns=['x'])
df['x'].mean()
-8.999998092651367
x.mean()
-9.0000075889406528
Run Code Online (Sandbox Code Playgroud)
我可以接受这种差异.它处于32位浮点数精度的极限.
没关系.我星期五写了这个,解决方案今天早上给了我.这是由大量数据加剧的浮点精度问题.我需要在创建数据帧时将数据转换为64位浮点数:
df=pd.DataFrame(np.fromfile('FILENAME',dataType),dtype='float64')
Run Code Online (Sandbox Code Playgroud)
如果其他人遇到类似问题,我会留下帖子.
每次我开始一个新项目,当我需要比较一些浮点数或双变量时,我会像这样编写代码:
if (fabs(prev.min[i] - cur->min[i]) < 0.000001 &&
fabs(prev.max[i] - cur->max[i]) < 0.000001) {
continue;
}
Run Code Online (Sandbox Code Playgroud)
然后我想摆脱这些神奇的变量0.000001(和双倍的0.00000000001)和fabs,所以我写了一个内联函数,有些定义:
#define FLOAT_TOL 0.000001
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有任何标准方法可以做到这一点?可能是一些标准的头文件?浮点数和双限制(最小值和最大值)也很好
该文件std::hypot说:
计算x和y的平方和的平方根,在计算的中间阶段没有过度溢出或下溢.
我很难设想一个std::hypot应该用于琐碎的测试用例sqrt(x*x + y*y).
以下测试表明,这std::hypot比天真计算慢大约20倍.
#include <iostream>
#include <chrono>
#include <random>
#include <algorithm>
int main(int, char**) {
std::mt19937_64 mt;
const auto samples = 10000000;
std::vector<double> values(2 * samples);
std::uniform_real_distribution<double> urd(-100.0, 100.0);
std::generate_n(values.begin(), 2 * samples, [&]() {return urd(mt); });
std::cout.precision(15);
{
double sum = 0;
auto s = std::chrono::steady_clock::now();
for (auto i = 0; i < 2 * samples; i += 2) {
sum += std::hypot(values[i], values[i + 1]);
} …Run Code Online (Sandbox Code Playgroud) 有没有人知道纬度/经度坐标的最有效表示?消费者GPS设备的准确度应该足够了.
大多数实现似乎都double用于每个单元,但我怀疑一个float或定点格式应该足够了.我很想听到任何试图压缩或存储这些值的大数组的人.
编辑:
换句话说,对于消费级设备来说,表示纬度/经度所需的最低精度是多少?
我想根据用户输入改变字符串中双重表示的精度.现在我正在尝试这样的事情:
String foo = String.format("%.*f\n", precision, my_double);
Run Code Online (Sandbox Code Playgroud)
但我收到了java.util.UnknownFormatConversionException.我对这种方法的启发是C printf和这个资源(1.3.1节).
我在某处有一个简单的语法错误,Java支持这种情况,还是有更好的方法?
编辑:
我想我可以这样做:
String foo = String.format("%." + precision + "f\n", my_double);
Run Code Online (Sandbox Code Playgroud)
但是我仍然对这种操作的原生支持感兴趣.