2015-08-11 11 views
6

Poiché std:ceil non è constexpr né in Visual Studio 2015, sto cercando un'implementazione constexpr che posso utilizzare in fase di compilazione, con scarso successo.Ricerca di una funzione constexprceil

Qualsiasi aiuto è apprezzato.

+1

Sede [Ceil: come possiamo implementare noi stessi?] (http://stackoverflow.com/a/8378022/369872) sembra che potrebbe essere scritto per essere constexpr – David

risposta

6

Dal momento che il compilatore di Visual Studio 2015 ancora non consente una funzione constexpr avere if condizionali e variabili, ho riscritto la soluzione di Jarod42 e li eliminato:

funzione
constexpr int32_t ceil(float num) 
{ 
    return (static_cast<float>(static_cast<int32_t>(num)) == num) 
     ? static_cast<int32_t>(num) 
     : static_cast<int32_t>(num) + ((num > 0) ? 1 : 0); 
} 
4

È possibile utilizzare

constexpr std::int32_t ceil(float num) { 
    std::int32_t inum = static_cast<std::int32_t>(num); 
    if (num == static_cast<float>(inum)) { 
     return inum; 
    } 
    return inum + (num > 0 ? 1 : 0); 
} 

Live demo

Nota: Non funziona una volta un intero non può rappresentare un valore float.

+0

Perché non 'float ceil (float);' come quello fornito da 'std'? – legends2k

+1

@ legends2k: questa implementazione non funziona per tutti i valori float, la firma lo riflette. – Jarod42

Problemi correlati