首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更有效的方法将双精度转换为浮点型?

有没有更有效的方法将双精度转换为浮点型?
EN

Stack Overflow用户
提问于 2011-10-06 16:13:06
回答 4查看 2.5K关注 0票数 6

我需要将多维双精度数组转换为交错浮点数组。大小将从2到6左右变化。

我很好奇如何循环并将双精度数转换为浮点数,这并不是太糟糕,对于2数组来说大约是225µs -这是代码:

代码语言:javascript
复制
const int count = 5;
const int numCh = 2;
double[,] dbl = new double[numCh, count];
float[][] flt = new float[numCh][];

for (int i = 0; i < numCh; i++)
{
    flt[i] = new float[count];
    for (int j = 0; j < count; j++)
    {
        flt[i][j] = (float)dbl[i, j];
    }
}

但是,如果有更有效的技术,我想使用它们。我应该提到的是,我只对两个嵌套循环进行了计时,而没有对之前的分配进行计时。

在进行了更多的实验后,我认为99%的时间都是在循环上消耗的,即使没有赋值!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-06 22:18:55

这会运行得更快,对于小的数据,不值得做Parallel.For(0, count, (j) =>,对于非常小的数据,它的运行速度要慢得多,这就是为什么我在这一节做了注释。

代码语言:javascript
复制
double* dp0;
float* fp0;

fixed (double* dp1 = dbl)
{
    dp0 = dp1;

    float[] newFlt = new float[count];
    fixed (float* fp1 = newFlt)
    {
        fp0 = fp1;
        for (int i = 0; i < numCh; i++)
        {
            //Parallel.For(0, count, (j) =>
            for (int j = 0; j < count; j++)
            {
                fp0[j] = (float)dp0[i * count + j];
            }
            //});
            flt[i] = newFlt.Clone() as float[];
        }
     }
  }

这运行得更快,因为由于数组边界检查,双重访问双数组[,]在.NET中确实很麻烦。newFlt.Clone()只是意味着我们不会一直修复和取消修复新指针(因为这样做会有一些开销)

您将需要使用unsafe代码标记运行它,并使用/UNSAFE进行编译

但实际上,您应该使用接近5000 x 5000而不是5 x 2的数据运行,如果需要的时间少于1000ms,则需要添加更多循环或增加数据,因为在该级别上,cpu活动的小峰值可能会给评测添加大量噪声。

票数 6
EN

Stack Overflow用户

发布于 2011-10-06 16:36:30

在你的例子中-我认为你不会像数组访问那样测量双精度/浮点数比较(这应该是处理器内部指令)(它有很多重定向加上明显的……aray分隔符检查(用于边界的数组索引异常)。

我建议在不使用数组的情况下执行测试。

票数 0
EN

Stack Overflow用户

发布于 2011-10-06 16:42:17

如果您可以在您的案例中也使用列表,则可以使用LINQ方法:

代码语言:javascript
复制
List<List<double>> t = new List<List<double>>();
//adding test data
t.Add(new List<double>() { 12343, 345, 3, 23, 2, 1 });
t.Add(new List<double>() { 43, 123, 3, 54, 233, 1 });
//creating target
List<List<float>> q;
//conversion
q = t.ConvertAll<List<float>>(
        (List<double> inList) => 
        {
            return inList.ConvertAll<float>((double inValue) => { return (float)inValue; });
        }
     );

如果它更快,你必须测量你自己。(怀疑)但你可以将它并行化,这可能会使它紧固(PLINQ)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7671700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档