簡體   English   中英

在C99中為復雜算術輸入安全性

[英]Type safety for complex arithmetic in C99

我正在使用C的復雜算術支持,並遇到了一些令人驚訝和不良行為。 復數值似乎可以隱式轉換為實數,丟棄虛部。

考慮以下:

#include <complex.h>
#include <stdio.h>

float complex getComplex(float real, float imag)
{
    return real + imag * I;
}

int main()
{
    const float /* missing complex! */ c = getComplex(25, 6) / getComplex(2, 4);
    printf("%f + %f J\n", crealf(c), cimag(c));
    return 0;
}

我希望收到一些警告,我將float complex crealf float或者調用crealfcimagf上的非復數值,但是這-Wall -Wextra -Wconversion地構建在GCC 5.1上,即使使用-Wall -Wextra -Wconversion開關-Wall -Wextra -Wconversion Clang 3.6.1至少發出這樣的警告:

wut.c:11:62: warning: implicit conversion discards imaginary component: '_Complex float' to 'float'
      [-Wconversion]
    const float /* missing complex! */ c = getComplex(25, 6) / getComplex(2, 4);
                                       ~   ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~

為什么復雜的價值觀會“崩潰”到真正的價值觀? 在標准中是否有一些關於此的措辭? 是否有一些額外的GCC開關可以提供有關此行為的警告? 它已經咬了我們,並且為這個項目切換工具鏈(到clang)目前是不可行的。

C11最終草案(N1570),6.3.1.7第2段:

當復數類型的值轉換為實數類型時,將丟棄復數值的虛部,並根據相應實數類型的轉換規則轉換實部的值。

實數類型是整數和實數浮點類型。

C99理由解釋了這背后的動機:

在數學中,當復數轉換為實數時,虛部被丟棄。 C99遵循相同的慣例。

並且(編號與C11相同):

§6.3.1.6和§6.3.1.7中的規范與Fortran相匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM