解决浮点舍入问题C ++
我开发了一种科学应用(模拟在细胞核中移动的染色体)。将染色体分成小片段,使用4x4旋转矩阵围绕随机轴旋转。
问题是模拟执行数千亿次旋转,因此浮点舍入误差会呈指数级增长并逐渐增长,因此随着时间的推移,碎片会“漂浮”并与染色体的其余部分分离。
我在C ++中使用双精度。软件暂时在CPU上运行,但将移植到CUDA,模拟最多可持续1个月。
我不知道我怎么能以某种方式重新规范化染色体,因为所有的片段都被链接在一起(你可以把它看成是一个双重链接列表),但我认为如果可能的话,这将是最好的想法。
你有什么建议吗 ?我觉得有点迷茫。
非常感谢你,
H。
编辑:
添加了简化的示例代码。
您可以假设所有矩阵数学都是经典实现。
// Rotate 1000000 times
for (int i = 0; i < 1000000; ++i)
{
// Pick a random section start
int istart = rand() % chromosome->length;
// Pick the end 20 segments further (cyclic)
int iend = (istart + 20) % chromosome->length;
// Build rotation axis
Vector4 axis = chromosome->segments[istart].position - chromosome->segments[iend].position;
axis.normalize();
// Build rotation matrix and translation vector
Matrix4 rotm(axis, rand() / float(RAND_MAX));
Vector4 oldpos = chromosome->segments[istart].position;
// Rotate each segment between istart and iend using rotm
for (int j = (istart + 1) % chromosome->length; j != iend; ++j, j %= chromosome->length)
{
chromosome->segments[j].position -= oldpos;
chromosome->segments[j].position.transform(rotm);
chromosome->segments[j].position += oldpos;
}
}
没有找到相关结果
已邀请:
7 个回复
禽兢玫坞劲
如果你总是引用t0,你可以这样做
所以在任何时候,tn,要获得你的真实位置,你必须做(x0,y0)+(dxn,dyn) 现在像我的例子一样简单的翻译,你可能不会赢得很多。但对于轮换,这可以节省生命。只需保留一个与每个染色体相关的欧拉角矩阵,然后更新它而不是染色体的实际位置。至少这样他们就不会飘走了。
藕挝
的数据不仅仅来自时间步长
中的浮点数据。尽量确保将浮点错误的产生限制在单个时间步长。 没有更具体的问题需要解决,这里很难说更具体的内容。
提孺局缎
磁辫覆氓
渐首洽陈染
薄响
缔恃钨