首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列专业转到行专业

从列专业转到行专业
EN

Stack Overflow用户
提问于 2015-06-23 15:53:56
回答 1查看 775关注 0票数 1

我正在尝试转换一个算法,该算法是用Fortran编写的,它使用列的主要排序,而C使用行的主要排序。该算法使用gemv调用。

我更改了对行主布局的调用,就像在cblas接口中一样:

  • 切换转置旗
  • 交换M和N
  • 改变前导尺寸

但是算法的行为并不相同。我得到了不同的结果。我创建了一个显示行为的最小样本。

代码语言:javascript
复制
#include <stdio.h>

void dgemv_( const char * t, const int * m, const int * n, const double * alpha, const double * A, const int *lda, const double * X, const int * incx, 
    const double * beta, double * Y, const int *incy );

int main()
{
    const int M = 2, N = 2;
    const int one = 1;
    const double alpha = -1.0, beta = 1.0;
    const char trans = 'T';
    const char noTrans = 'N';

    double Yc[4] = { 0x1.42c7bd3b6266cp+4, 0x1.6c6ff393729dp+4, 0x1.acee1f3938c0bp-2, 0x1.b0cd5ba440d93p+0 };
    double Yr[4] = { 0x1.42c7bd3b6266cp+4, 0x1.acee1f3938c0bp-2, 0x1.6c6ff393729dp+4, 0x1.b0cd5ba440d93p+0 };

    double A[2] = { 0x1.11acee560242ap-2, 0x1p+0 };

    double Bc[2] = { 0x1.8p+2, 0x1.cp+2 };
    double Br[2] = { 0x1.8p+2, 0x1.cp+2 };

    dgemv_( &noTrans, &M, &N, &alpha, Yc, &M, A, &one, &beta, Bc, &one );

    printf("Result Column Major\n");
    printf("%a %a\n", Bc[0], Bc[1]);

    dgemv_( &trans, &N, &M, &alpha, Yr, &N, A, &one, &beta, Br, &one );

    printf("Result Row Major\n");
    printf("%a %a\n", Br[0], Br[1]);
}

我使用了格式字符串%a来获取值的十六进制表示形式来比较它们。使用列主版本生成的向量如下所示:

代码语言:javascript
复制
0x1.8402515a17beap-3 -0x1.8e67415bce3aep-1

而对于一排主修来说,如下所示:

代码语言:javascript
复制
0x1.8402515a17bep-3 -0x1.8e67415bce3bp-1

这是如何解释和可以做什么,使算法的工作同等?

EN

回答 1

Stack Overflow用户

发布于 2015-06-23 19:53:25

如果将结果与十进制表示进行比较

代码语言:javascript
复制
double x = 0x1.8402515a17beap-3, y = 0x1.8402515a17bep-3;
printf( "%40.30f\n", x );
printf( "%40.30f\n", y );
printf( "%40.30f\n", x - y );

他们同意多达15个重要数字。

代码语言:javascript
复制
    0.189457545816338168709336287066
    0.189457545816337891153580130776
    0.000000000000000277555756156289

因此,对于用double进行双精度计算来说,差别似乎足够小。-0x1.8e67415bce3aep-1-0x1.8e67415bce3bp-1的差值也在1.0e-15以下.

代码语言:javascript
复制
   -0.778131525475250773737911913486
   -0.778131525475250995782516838517
    0.000000000000000222044604925031

为了取得更好的一致,可能需要四倍(或更高)的精度。

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

https://stackoverflow.com/questions/31007672

复制
相关文章

相似问题

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