将代码从python转换为c后输出的差异

z0qdvdin  于 2023-08-03  发布在  Python
关注(0)|答案(1)|浏览(89)

我在Python中有这个代码,它工作正常。这个代码的思想是根据阈值计算数组中每个值的重复。Python代码的输出是[value,repetition]

[1.2, 3, 2.4, 1, 2.5, 1, 2.3, 1, 2.4, 1, 8.5, 2, 8.9, 1, 9.11, 1]

个字符
这是C代码,C代码的输出是:

1.100000  2  1.200000 1  2.500000  2  2.300000  1  2.400000  1  
8.600000  1 8.500000  1  8.900000  1  9.110000  1
int dif(float x,float y,float sigma1){
    int res=0;
    if(fabsf(x-y) <= sigma1)
        res=1; 
    return res;
}

void RL(){

    float text [] = {1.1,1.1,1.2,2.4,2.5,2.3,2.4,8.6,8.5,8.9,9.11} ;           
    int n = sizeof(text)/sizeof(text[0]); 
    float th =0.1;    
    float num[30]; int nc = 0;
    int cou[30];   int nc1= 0;
    int index=0;
    int unt=1;
    while (index<(n)){  
      if ( (index==(n-1)) || (dif(text[index],text[index+1],th)!=1)  )  {
                   
            cou[nc]  = unt; nc=nc+1;
            num[nc1]  = text[index]; nc1=nc1+1;
            unt=1;
      }
      else{
        unt=unt+1;            
      }
        index=index+1  ;
 
    }
    for(int i=0; i<nc;i++){ 
       printf(" %3f   %d \n ",num[i],cou[i]);
           
        }   
}

的字符串
为什么C代码将值处理为int而不是float(将重复计算为int)?如何解决这个代码中的问题?注意:如果我使用int数组,C代码可以正常工作。

xmd2e60i

xmd2e60i1#

从@user3386109的评论中,我们应该考虑Python和C代码中float和double的区别。一种方法是通过添加一个小的Epsilon来补偿(1.2-1.1)不完全是0.1的事实。例如,我将使用10 e-6的Epsilon(您可以使用更小的数字)。
下面是修改后的Python代码:

import math
EPS = 0.000001

def dif(x, y, ma1):
    res=0
    z = math.fabs(x-y) 
    if( z <= (ma1+EPS)):
        res=1
    return res

def enc(text,th):
    coded=[]
    coded.clear()
    index=0
    unt=1
    while index<=(len(text)-1):  
      if index==(len(text)-1) or  dif(text[index],text[(index+1)],th) !=1:  
        coded.append(text[index])
        coded.append(unt)       
        unt=1
      else:
        unt=unt+1            
      index=index+1   
    return coded
SenList=[1.1,1.1,1.2,2.4,2.5,2.3,2.4,8.6,8.5,8.9,9.11]
th = 0.1
comm= enc(SenList,th)
print(comm)

字符串
这次运行的结果与原始代码不同:

[1.2, 3, 2.5, 2, 2.4, 2, 8.5, 2, 8.9, 1, 9.11, 1]


下面是修改后的C代码:

#include <stdio.h>
#include <math.h>

#define EPS 10.0e-6
int dif(float x,float y,float sigma1){
    int res=0;
    float z;
    
    z = fabs(x-y);
    if(z <= (sigma1+EPS))
        res=1; 
    return res;
}
void RL(){

    float text [] = {1.1,1.1,1.2,2.4,2.5,2.3,2.4,8.6,8.5,8.9,9.11} ;           
    int n = sizeof(text)/sizeof(text[0]); 
    float th =0.1;    
    float num[30]; int nc = 0;
    int cou[30];   int nc1= 0;
    int index=0;
    int unt=1;
    while (index<(n)){  
      if ( (index==(n-1)) || (dif(text[index],text[index+1],th)!=1)  )  {
                   
            cou[nc]  = unt; nc=nc+1;
            num[nc1]  = text[index]; nc1=nc1+1;
            unt=1;
      }
      else{
        unt=unt+1;            
      }
        index=index+1  ;
 
    }
    for(int i=0; i<nc;i++){ 
       printf("%3.2f, %d, ",num[i],cou[i]);
           
        }   
}

int main()
{
    printf("C code output: ");
    RL();

    return 0;
}


C代码的结果与更改后的Python相同:

C code output: 1.20, 3, 2.50, 2, 2.40, 2, 8.50, 2, 8.90, 1, 9.11, 1,


如果你用调试器运行这两段代码,你会发现dif()函数中的'z'值在C和Python之间的第三次迭代中是不同的:

in Python z= 0.09999999999999987

    in C      z= 0.100000024


通过在dif()函数中使用小的Epsilon,您将在两种语言中获得相同的结果。

相关问题