AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77955227
Accepted
pablo1977
pablo1977
Asked: 2024-02-07 21:40:23 +0800 CST2024-02-07 21:40:23 +0800 CST 2024-02-07 21:40:23 +0800 CST

Existência ou não de long_double_t (padrão C:C23)

  • 772

A nova norma C (ISO/IEC 9899:2023, também conhecida como C23),
no Anexo H, são definidas diversas macros e tipos,
relativos à aritmética real e complexa,
sujeitos à norma ISO/IEC 60559 (aritmética de ponto flutuante).

De acordo com a subseção H.1, existem três
macros definidas pela implementação para testar a conformidade
com as definições do Anexo H.

__STDC_IEC_60559_TYPES__  
__STDC_IEC_60559_BFP__  
__STDC_IEC_60559_DFP__  

Além disso, para “ativar” as macros e tipos associados,
o usuário deve definir a macro:

__STDC_WANT_IEC_60559_TYPES_EXT__  

A redação da norma é clara em vários detalhes:

  • Se __STDC_IEC_60559_BFP__for definido pelo compilador, isso implica que _FloatNe _FloatN_toutros _FloatN*tipos são definidos.
  • Se __STDC_IEC_60559_DFP__for definido pelo compilador, isso implica que _DecimalNe _DecimalN_toutros _DecimalN*tipos são definidos.
  • Em ambos os casos, a macro __STDC_IEC_60559_TYPES__está definida.
  • Se a macro __STDC_IEC_60559_TYPES__estiver definida, significa que pelo menos uma das macros __STDC_IEC_60559_BFP__ou __STDC_IEC_60559_DFP__(ou ambas) está definida.

Na subseção H.11, o tipo long_double_té adicionado a <math.h>.

No entanto, não consigo deduzir em que condições se pode garantir a existência de long_double_tuma determinada implementação.

PERGUNTA:

Se __STDC_IEC_60559_TYPES__estiver definido, é suficiente ter certeza de que long_double_ttambém está definido em <math.h>?

Minha dúvida vem do seguinte caso particular que pode surgir:

  • __STDC_IEC_60559_TYPES__e __STDC_IEC_60559_DFP__estão definidos, mas __STDC_IEC_60559_BFP__não estão definidos.

Neste caso, os tipos decimais são definidos.
No entanto, long_double_tnão é um tipo decimal.

SUBLEMA:
A macro __STDC_IEC_60559_BFP__deve existir para garantir a existência de long_double_t?

COMENTÁRIOS:

Como @John Bollinger explica em sua resposta,
a existência de *BFP__e/ou *DFP__macros
apenas garante que _FloatNexistam _DecimalNpara certos valores pequenosN de .
(Eu estava ciente desse detalhe, mas minha explicação não foi a melhor.)

Link para um rascunho padrão do C23

c
  • 1 1 respostas
  • 98 Views

1 respostas

  • Voted
  1. Best Answer
    John Bollinger
    2024-02-08T00:05:54+08:002024-02-08T00:05:54+08:00

    DR: a base mínima para confiar no fornecimento de uma implementação em conformidade long_double_té que ela defina macro __STDC_IEC_60559_TYPES__como 202311L.

    No entanto, a unidade de tradução também deve definir __STDC_WANT_IEC_60559_TYPES_EXT__(para qualquer coisa) antes de incluir math.h pela primeira vez para que essa definição seja realmente exposta. (C23 H.8/1)

    A redação da norma é clara em vários detalhes:

    Aparentemente não é tão claro.

    Como questão preliminar, a especificação diz

    Uma implementação que defina __STDC_IEC_60559_TYPES__deve 202311L estar em conformidade com as especificações deste anexo.

    Isto deve ser entendido para evitar que as implementações se conformem com qualquer coisa no anexo se não definirem __STDC_IEC_60559_TYPES__esse valor específico (mesmo que o definam com algum outro valor). Esta é uma medida intencional de compatibilidade futura.

    A especificação continua dizendo:

    Uma implementação só pode definir __STDC_IEC_60559_TYPES__se definir __STDC_IEC_60559_BFP__[...] ou definir__STDC_IEC_60559_DFP__

    Observe bem que, de acordo com o anterior, nem essa disposição nem qualquer outra coisa no anexo se aplicam, a menos que __STDC_IEC_60559_TYPES__seja definido exatamente como 202311L. Caso contrário, todas as apostas serão canceladas no que diz respeito ao Anexo H (de C23). Por exemplo, uma implementação que definisse __STDC_IEC_60559_TYPES__nada e não definisse um __STDC_IEC_60559_BFP__ou outro __STDC_IEC_60559_DFP__não deixaria de estar em conformidade por esse motivo.

    • Se __STDC_IEC_60559_BFP__for definido pelo compilador, isso implica que _FloatNe _FloatN_toutros _FloatN*tipos são definidos.

    Não exatamente. A especificação não associa nenhum requisito __STDC_IEC_60559_BFP__apenas à definição de uma implementação. Além da restrição geral por definição de __STDC_IEC_60559_TYPES__, discutida acima, a especificação condiciona explicitamente algumas das disposições específicas nesta área à definição da última macro.

    Quando todas essas condições são atendidas, uma implementação em conformidade fornece tipos _Float32e _Float64, e esses são equivalentes a floate double, respectivamente. Além disso, nessas circunstâncias, se long doublecorresponder a um dos formatos de troca binária ISO 60559 para alguma largura N maior que 64, então a implementação fornece o _FloatNtipo correspondente como equivalente a long double. Outros _FloatNtipos são permitidos, mas não obrigatórios, e o conjunto deles é definido pela implementação. (H.2.1/4)

    Uma implementação em conformidade que se vincule às disposições deste anexo fornece _FloatN_tem seu math.h para cada _FloatNtipo que fornece.

    • Se __STDC_IEC_60559_DFP__for definido pelo compilador, isso implica que _DecimalNe _DecimalN_toutros _DecimalN*tipos são definidos.

    Novamente, as implementações não estão vinculadas a nada no anexo, a menos que sejam definidas __STDC_IEC_60559_TYPES__adequadamente. Nesse caso, __STDC_IEC_60559_DFP__ser definido implica que _Decimal32, _Decimal64e _Decimal128são fornecidos. Tipos adicionais _DecimalNsão explicitamente permitidos e que o conjunto de tais tipos adicionais é definido pela implementação.

    Quando as disposições do anexo se aplicarem, math.h fornecerá um _DecimalN_tcorrespondente a cada uma _DecimalNque a implementação definir.

    • Em ambos os casos, a macro __STDC_IEC_60559_TYPES__está definida.

    Não, não existe tal exigência. A lógica é inversa. Conforme já discutido, nenhum dos itens do Anexo H se aplica, a menos que __STDC_IEC_60559_TYPES__seja definido adequadamente. Se for, então pelo menos uma das outras duas macros também deve ser definida, mas uma delas definida não é base para concluir nada sobre __STDC_IEC_60559_TYPES__.

    • Se a macro __STDC_IEC_60559_TYPES__estiver definida, significa que pelo menos uma das macros __STDC_IEC_60559_BFP__ou __STDC_IEC_60559_DFP__(ou ambas) está definida.

    Mais especificamente, isso se aplica apenas se __STDC_IEC_60559_TYPES__for definido exatamente como 202311L.


    Se __STDC_IEC_60559_TYPES__estiver definido, é suficiente ter certeza de que long_double_ttambém está definido em <math.h>?

    A macro __STDC_IEC_60559_TYPES__definida com exatidão 202311Lé suficiente para ter certeza de que long_double_testá disponível na implementação. O anexo não impõe quaisquer condições adicionais a este respeito. O programa precisa ser ativado, no entanto. C23 H.8/1:

    Os identificadores adicionados aos cabeçalhos da biblioteca por este anexo são definidos ou declarados pelos seus respectivos cabeçalhos apenas se a macro __STDC_WANT_IEC_60559_TYPES_EXT__for definida (pelo usuário) no ponto do código onde o cabeçalho apropriado é incluído pela primeira vez.

    Você escreveu:

    Minha dúvida vem do seguinte caso particular que pode surgir:

    • __STDC_IEC_60559_TYPES__e __STDC_IEC_60559_DFP__estão definidos, mas __STDC_IEC_60559_BFP__não estão definidos.

    Neste caso, os tipos decimais são definidos.

    Verdadeiro.

    No entanto, long_double_tnão é um tipo decimal.

    Quem diz? C23 6.2.6.1/1:

    As representações de todos os tipos não são especificadas, exceto conforme indicado nesta subseção.

    Essa subcláusula não define a representação de nenhum tipo de FP.

    Não há nenhum requisito de que long doubleseja long_double_tdo tipo binário. Parece nem haver uma exigência de que esses dois tipos sejam equivalentes, embora eu esperasse que isso fosse uma questão de qualidade de implementação.

    Mas não há problema, mesmo que long_double_tseja do tipo binário. __STDC_IEC_60559_BFP__não ser definido não implica que a implementação não forneça nenhum tipo binário de FP. Significa apenas que a implementação se recusa a prometer que está em conformidade com todas as disposições do Anexo H no que diz respeito aos tipos de FP binários.

    A macro é __STDC_IEC_60559_BFP__necessária para existir para garantir a existência de long_double_t?

    Não. H.11/6 especifica que long_double_testá disponível em math.h, sujeito à aceitação do programa conforme discutido acima, e que não está condicionado a nada além da mesma __STDC_IEC_60559_TYPES__macro de teste de recurso à qual tudo no anexo está condicionado. Portanto, se uma implementação em conformidade for definida __STDC_IEC_60559_TYPES__, 202311Lentão seu math.h será definido long_double_tpara os programas que aceitarem.

    • 2

relate perguntas

  • Multiplicação mais rápida que *

  • Usando uma macro para comprimento de string no especificador de formato scanf () em C

  • Como você pode definir o tipo de dados de #define para long double?

  • Ponteiros const incompatíveis

  • Mudança de cor não gradual no OpenGL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve