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

float cie1931(float input_value)
{
	input_value *= 100.0f;
	/* input_value => <0,1> */
	/* L* = input_value * 100 */
	/* Y = (L* / 903.3)           if L* <= 8 */
	/* Y = ((L* + 16) / 116)^3    if L* > 8 */
	/* L* => Vstupni hodnota <0,100> */
	/* Y  => Vystupni hodnota <0,1> */
	if(input_value <= 8)
	{
		return (input_value/903.3f);
	}else
	{
		return (powf((float)((input_value+16.0f)/116.0f), (uint8_t)3));
	}
}


uint16_t cie1931_compute(uint16_t input)
{
	const uint16_t input_size = 0xFFFF;			/// Maximal input value
	const uint16_t output_size = 0xFFFF>>1;		/// Maximal output value
	return (uint16_t)ceil((float)cie1931((float)input/(input_size))*(output_size));
}
