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 / 77033792
Accepted
SRobertJames
SRobertJames
Asked: 2023-09-04 03:01:49 +0800 CST2023-09-04 03:01:49 +0800 CST 2023-09-04 03:01:49 +0800 CST

Qual é a maneira correta de determinar `ticks` do clock `freq` enquanto evita overflow em C em um microcontrolador?

  • 772

Qual é a maneira correta de multiplicar e dividir ints em C para evitar estouro? Quero determinar quanto tempo ticksum temporizador rodando em freq(em Hz) levará para fazer a delay(em ms). Isso deveria ser ticks = freq * delay / 1000.

Mas, essa linha parece perigosa para mim. Se escrevermos (freq * delay) / 1000corremos o risco de transbordar. Se, em vez disso, escrevermos freq * (delay / 1000), entraremos em carros alegóricos - que são desnecessários e propensos a erros, especialmente. em um microcontrolador.

Qual é a maneira correta de fazer isso?

c
  • 2 2 respostas
  • 35 Views

2 respostas

  • Voted
  1. Best Answer
    Clifford
    2023-09-04T03:51:30+08:002023-09-04T03:51:30+08:00

    Sua sugestão:

    freq * (delay / 1000)
    

    Não é uma operação de ponto flutuante. Isso exigiria:

    freq * (delay / 1000.0)
    

    Mas você está certo de que não é necessário. Muito melhor seria:

    (freq / 1000) * delay
    

    Contanto que freqseja um múltiplo de 1000, isso não resultará em perda de precisão e evitará pelo menos um estouro "prematuro" (ou seja, um estouro que ocorre em valores mais baixos devido a uma má escolha da ordem de operação).

    É claro que um overflow continua possível, mas esta expressão fornece o alcance máximo possível sem delayrecorrer a um tipo maior. Por exemplo, se a expressão for do tipo uint32_t, delaypode ter até 2 32/1000 ou quase 72 minutos.

    Criticamente, a reordenação permite que o intervalo delayseja determinístico em qualquer sistema. Não depende mais do valor de freq- serão sempre 72 minutos.

    Se 72 minutos não forem suficientes, você poderá considerar um atraso de resolução menor (segundos inteiros, por exemplo) antes de recorrer a um tipo de dados maior (que será menos eficiente e poderá adicionar problemas de atomicidade). Atrasos longos raramente exigem precisão de milissegundos, e seu relógio pode ter precisão de milissegundos durante esse período de tempo em qualquer caso - até mesmo os TCXO têm precisão de normalmente 2 ppm.

    • 2
  2. 0___________
    2023-09-04T03:22:04+08:002023-09-04T03:22:04+08:00

    Simplesmente, pense em quanto tempo máximo de atraso você pode ter.

    Se estiver usando um número não assinado de 32 bits (números negativos para atraso não são muito práticos porque não sei como ter um atraso negativo que nos levaria de volta no tempo). O uint32_t máximo é 4.294.967.295, o que é suficiente para atraso de mais de uma hora.

    Se você definir seu cronômetro para aumentar a cada 1/1000 segundos, uint32_t será suficiente para atrasar 49.7102696181dias

    Se precisar de mais, use um número inteiro sem sinal maior em seus cálculos:((uint64_t)freq * delay) / 1000

    • 1

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

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

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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